0.36 HTTP 协议基础:浏览器和服务器怎么对话
第〇篇【零基础预科】免费。前面讲了 IP、端口、URL,这一篇讲浏览器和服务器之间真正通信时遵循的规则——HTTP。
一、HTTP 是什么
HTTP(HyperText Transfer Protocol,超文本传输协议) 是浏览器和服务器之间通信时共同遵守的一套规则。你可以把它理解成 Web 世界的【通用语言】:浏览器按 HTTP 的格式发请求,服务器按 HTTP 的格式回响应,双方都听得懂。
为什么安全学习必须懂 HTTP?因为我们分析漏洞、抓包、构造测试,打交道的对象本质上都是一个个 HTTP 报文。看不懂报文,就像医生看不懂化验单,后面的工具再强也只是盲点。
二、一次通信的结构
一次 HTTP 通信是【一来一回】:
- 请求 Request:浏览器发给服务器,说明我想干什么
- 响应 Response:服务器返回结果
请求报文的结构分四块:
POST /login HTTP/1.1 ← 请求行:方法 + 路径 + 版本
Host: example.com ← 请求头(若干行,键: 值)
Content-Type: application/json
← 空行(分隔头部和正文)
{"user":"bob","pass":"123"} ← 请求体(提交的数据,GET 常为空)响应报文的结构类似:
HTTP/1.1 200 OK ← 状态行:版本 + 状态码 + 原因
Content-Type: application/json ← 响应头
← 空行
{"age":25,"name":"Bob"} ← 响应体(返回的页面或数据)记住这个【行 + 头 + 空行 + 体】的结构,所有 HTTP 报文都是这个套路。
三、请求方法
方法用来说明这次请求想做什么,最常见的两个:
| 方法 | 用途 | 数据位置 |
|---|---|---|
| GET | 获取资源(打开网页、查询) | 多在 URL 查询串里 |
| POST | 提交数据(登录、上传) | 在请求体里 |
GET 的参数挂在 URL 后面(如 ?id=1),会留在历史记录和日志里,所以不适合放敏感信息;POST 的数据放在请求体中,不直接显示在地址栏。此外还有 PUT(上传/更新)、DELETE(删除)等方法,很多未授权漏洞就出在这些方法被意外开放。
四、状态码
状态码是服务器用三位数字告诉浏览器这次请求的结果:
| 状态码 | 含义 | 常见场景 |
|---|---|---|
| 200 | 成功 | 正常返回页面/数据 |
| 302 | 临时重定向 | 登录成功后跳转到首页 |
| 403 | 禁止访问 | 没有权限 |
| 404 | 资源不存在 | 地址写错 |
| 500 | 服务器内部错误 | 后端代码/配置异常 |
可以按首位粗分:2xx 成功、3xx 跳转、4xx 客户端问题(请求有误)、5xx 服务端问题。测试时 500 报错尤其值得关注,详细的错误信息可能泄露后端框架、路径甚至代码逻辑。
五、HTTP 与 HTTPS
HTTP 默认是明文传输,数据在网络中经过的每一跳都可能被窃听或篡改。HTTPS 在 HTTP 和 TCP 之间加了一层 TLS/SSL 加密:
- 内容被加密,中途难以窃听
- 带有身份验证,确认连的是真服务器
- 能防止数据被篡改
所以涉及登录、支付的网站都应使用 HTTPS。但要注意:HTTPS 加密的是传输过程,数据到达服务器后依然是明文,它解决的是传输安全,不等于应用本身没有漏洞。
六、安全视角
抓包工具(如浏览器开发者工具的 Network 面板、Burp Suite)能把 HTTP 报文完整展示出来。安全测试时重点观察:
- 请求里有哪些参数,分别传到了哪里
- 请求头中的 Cookie、Authorization(身份凭证)
- 响应里的状态码、报错信息、返回数据
- 隐藏表单字段、前端写死的配置
很多漏洞的判断,都始于【修改某个参数,观察服务器响应有什么变化】。而要修改参数,前提是先能读懂原始报文。
七、本篇小结
- HTTP 是浏览器和服务器通信的规则,一次通信 = 请求 + 响应。
- 报文结构:请求行/状态行 + 头部 + 空行 + 体。
- GET 取数据、POST 提交数据;状态码按 2/3/4/5 分类理解。
- HTTPS 是加密版 HTTP,解决传输安全但不消除应用漏洞。
下一篇 0.37 讲网站如何记住你是谁——Cookie 与 Session。