Skip to content
📌知识点小结
  • 客户端是“发起请求、使用服务”的一方(如浏览器、App);服务器是“提供资源/处理请求”的一方。
  • 二者按“请求—响应”模式工作:客户端发请求,服务器返回结果。
  • 浏览器是最常见的客户端,负责渲染 HTML、执行 JS、保存 Cookie。
  • 一台服务器可同时服务很多客户端;客户端也可向多个服务器请求。
  • 安全要分清“代码在哪边执行”:前端在用户浏览器,后端在服务器,信任边界由此划分。
✅自测一下

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 应用。