0.20 客户端与服务器:谁在请求,谁在响应
第〇篇【零基础预科】免费。这一篇明确网络通信两端的角色,以及一条极重要的安全分界线。
一、两种角色
- 客户端(Client):主动发起请求、使用服务的一方。浏览器是最典型的客户端,手机 App、命令行 curl 也可以是客户端;
- 服务器(Server):监听端口、接收请求、处理并返回响应的一方(如你的 OpenResty + 网站文件)。
这种"请求—响应"模式是 Web 的基本工作方式。
你可能会觉得"客户端"这个词很陌生,但它其实无处不在。你手机上的微信、淘宝、抖音 App,全都是客户端——它们负责把界面画出来、让你点、帮你把请求发出去;真正的计算、存储、推荐逻辑,都在远端的服务器上。你刷到的每条短视频,并不是手机本地存好的,而是服务器根据你的浏览记录实时挑出来、一条一条发过来的。反过来,你在浏览器地址栏输入 https://gysec.top 回车的瞬间,浏览器这个客户端做的事,和微信 App 没有本质区别:都是"我要拿点东西,你给我"。
你可能会问:我连自己电脑上的程序,也算客户端和服务器吗? 算。哪怕服务器就跑在你自己的机器上(比如本地搭的靶场
127.0.0.1:8080),角色分工也没变:你的浏览器是客户端,本地那个监听 8080 端口的程序是服务器。网络位置不重要,"谁主动发请求、谁被动等连接并回应"才是区分两端的标准。
还有一个容易忽略的点:一台服务器同时服务成百上千个客户端。你刷朋友圈的那一刻,和全国几百万人刷的是同一批服务器;服务器不会为每个人单独开一台机器,而是在自己内部快速轮转,帮每个人处理完一个请求再处理下一个。这也是为什么服务器一般都放在机房、用 Linux 跑——它要的是稳定、抗并发、不关机,而不是漂亮的桌面。
二、浏览器这个客户端做了什么
- 把 URL 解析、发起网络请求;
- 接收 HTML/CSS/JS 并渲染成你看到的页面;
- 执行 JavaScript(在你自己的电脑上);
- 保存和回传 Cookie、缓存;
- 处理表单、点击等交互。
把"渲染"这个词说具体点:服务器发回来的其实就是一堆纯文本——HTML 标签、CSS 样式、JavaScript 代码。浏览器拿到这些文本后,要像排版工人一样,把标题放大、把正文排好、把图片位置留出来、把按钮画成可点的样子,最后才变成你看到的网页。同一段 HTML,用手机浏览器和电脑浏览器看到的布局可能不一样,不是服务器发了不同的东西,而是两端的"排版工人"根据屏幕宽度做了不同安排。
你可能会问:那我按 F12 看到的是什么? F12 打开的"开发者工具",看到的就是浏览器手里那份原始文本和它排版后的中间状态。你能看到 HTML、改 CSS 立刻换色、看到每条请求发给了哪、服务器回了什么——因为这一切都发生在你的电脑上,浏览器对你完全敞开。这也正是下一节要讲的安全分界线:你能看见、能改的东西,就不能拿来当"秘密"。
三、关键安全分界线:代码在哪边跑
这是初学者必须建立的信任边界:
| 前端(客户端) | 后端(服务器) | |
|---|---|---|
| 运行位置 | 用户的浏览器/设备 | 远程服务器 |
| 用户能否查看/篡改 | 能(F12、改 JS、改请求) | 不能直接 |
| 适合放 | 展示、交互、体验性校验 | 真正的权限校验、密钥、数据库操作 |
结论:前端的一切对用户都是可见、可改的。
- 只在 JS 里判断"是否会员、是否管理员"毫无安全意义,因为别人能直接改;
- 真正的访问控制必须在服务器执行——这正是本网站付费内容由 OpenResty + Lua 在服务器端校验 Cookie、而不是靠前端隐藏的原因;
- 密钥、数据库连接串绝不能写进前端。
前端校验仍然要做,但目的是体验(即时提示、减少无效请求),安全校验在服务器再做一遍。
举个真实到不能再真实的例子。某个网站的前端 JavaScript 里写了一段:"如果用户是管理员,就显示后台入口"。新手开发者觉得这样藏起来就行了。但稍微懂点的人按 F12 一看,那段 JS 就在那儿躺着——他要么直接删掉判断、让按钮显示出来;要么干脆绕过页面,直接用工具(后面会讲的 Burp、curl)向"后台接口"发一个请求。前端代码里压根没有"秘密",它从服务器发下来的那一刻就已经暴露在用户眼前了。
这也是为什么本系列反复强调:凡是不能被用户知道的东西,就不能放在前端。 密码不能明文写在 JS 里;数据库连接串不能打包进前端文件;"你是不是会员"这种判断,服务器每次都要重新查一遍,而不是信前端传来的一个 isVip=true。前端把开关藏起来只能挡住完全不懂技术的普通用户,挡不住任何一个会按 F12 的人。
四、Cookie 与登录态
登录成功后,服务器用 Set-Cookie 让浏览器保存一个凭证;之后浏览器对同站请求自动带上这个 Cookie,服务器据此认出你。
- 这也是为什么"退出登录"要让服务器清除 Cookie;
- 在公用电脑上用完应主动退出。
Cookie 本身是一小段文本,它存在你的浏览器里,浏览器在每次请求时自动带上。正因为是"自动带上",它带来了一个安全隐患:如果你的 Cookie 被别人拿到,别人在自己的浏览器里塞上这段 Cookie,服务器就会把他当成你——因为服务器认的是 Cookie 里的凭证,不是认人。这就是为什么前面 0.22 那篇要提醒你"公共 Wi-Fi 别乱登录、别在陌生网页输密码":Cookie 一旦在不安全的网络里被截走,等于家门钥匙被复制了一把。
你可能会问:那 Cookie 里存的是不是我的密码? 不是。服务器登录成功后发给你的,通常是一串随机生成的"令牌"(session id),而不是你输入的密码本身。密码只在登录那一次传输和校验,之后全程靠这串令牌认人。这样即使令牌泄露,改密码就能让旧令牌失效;如果直接把密码存进 Cookie,密码一泄露就全完了。
这也是为什么"退出登录"不只是"把网页关了"——它要通知服务器把那个令牌作废。你只关标签页不退出,Cookie 还留在浏览器里,下一个用这台电脑的人打开网站,可能直接还是登录状态。
五、本篇小结
- 客户端发起请求并展示(浏览器渲染、执行 JS),服务器处理并响应。
- Web 工作在"请求—响应"模式;Cookie 维持登录态。
- 前端代码用户可见可改,不能当安全边界;真正的校验、密钥、数据操作必须在服务器。
- 前端校验为体验,服务器校验为安全,二者都要。
下一篇 0.21 辨析三个常被混用的词:网页、网站、Web 应用。