4. HTTP/HTTPS 协议基础:请求方法与状态码详解
说实话,很多人学了几个月抓包,连 HTTP 请求方法都没搞明白。我见过不少同事,看到 301 就以为是报错,看到 500 就慌得不行。其实这些东西,说白了就是客户端和服务端之间约定好的「暗号」。
今天咱们就把这些暗号彻底拆开。你掌握了这章,抓包分析至少能看懂 80% 的流量。
4.1 请求方法:你到底是来干嘛的?
每次你打开网页、提交表单、删除文章,浏览器都会发一个 HTTP 请求。这个请求的第一行,就写着「请求方法」。它告诉服务器:我这次来,是想干什么。
常用的就四种,我按使用频率排个序:
| 方法 | 含义 | 幂等? | 请求体 | 我见过最坑的用法 |
|---|---|---|---|---|
| GET | 获取资源 | 是 | 无 | 用 GET 传密码,URL 里明文暴露 |
| POST | 创建/提交 | 否 | 有 | 把 POST 当 GET 用,参数全拼在 URL 上 |
| PUT | 全量更新 | 是 | 有 | 和 POST 混用,导致数据重复创建 |
| DELETE | 删除资源 | 是 | 通常无 | 用 GET 加 ?delete=1 来删数据 |
幂等是什么意思? 同一个请求执行 1 次和执行 100 次,结果一样。GET 查 100 次还是那条数据;POST 提交 100 次,服务器可能创建 100 条订单——这就是不幂等。
4.1.1 GET:最常用的「查」
你刷微博、看新闻、搜百度,全是 GET。它的特点是:参数全在 URL 里。
GET /search?q=抓包分析&page=1 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
注意看,参数 q 和 page 直接写在 URL 问号后面。这意味着什么?
- 浏览器历史记录里能看到
- 服务器日志里明文记录
- 分享链接时参数全暴露
千万别用 GET 传密码、身份证号、银行卡号。 我曾经审计过一个内部系统,登录页用 GET 提交,密码直接写在 URL 里。运维的 Nginx 日志每天明文记录所有密码,想想都后怕。
4.1.2 POST:用来「写」数据
登录、注册、下单、发帖,这些操作都用 POST。参数放在请求体里,URL 上看不到。
POST /api/login HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
username=admin&password=123456
抓包时你会看到,POST 请求多了一个 Content-Type 和 Content-Length。这是告诉服务器:我肚子里有货,你准备好接收。
我个人习惯,凡是会改变服务器数据的操作,一律用 POST。哪怕只是点个「已读」标记,也别用 GET。
4.1.3 PUT 和 DELETE:RESTful 风格的标配
这两个方法在传统网页里用得少,但在 API 接口里很常见。PUT 是「把整个资源替换掉」,DELETE 就是「删掉」。
PUT /api/user/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{"name": "张三", "age": 25}
DELETE /api/user/123 HTTP/1.1
Host: api.example.com
你想想看,如果所有操作都用 POST,服务器怎么区分是「创建」还是「更新」?只能用 URL 里加 /create 或 /update 来区分。而 PUT 和 DELETE 本身就是语义化的,一看就懂。
4.2 状态码:服务器给你的回执
每次请求发出去,服务器都会返回一个三位数的状态码。这就像快递单号的状态:200 是「已签收」,404 是「查无此人」,500 是「仓库着火了」。
我把最常用的几个状态码整理成了一张表,建议你保存下来:
| 状态码 | 含义 | 常见场景 | 抓包时看到它怎么办? |
|---|---|---|---|
| 200 OK | 请求成功 | 正常打开网页 | 正常,看响应体内容 |
| 301 Moved Permanently | 永久重定向 | HTTP 跳 HTTPS | 看 Location 头,浏览器会自动跳 |
| 302 Found | 临时重定向 | 登录后跳首页 | 同上,但下次可能不跳了 |
| 304 Not Modified | 缓存有效 | 静态资源复用 | 说明浏览器有缓存,没下载新内容 |
| 400 Bad Request | 请求格式错误 | 参数缺失、JSON 格式不对 | 检查请求体、参数名 |
| 401 Unauthorized | 未认证 | 没带 Token | 检查 Authorization 头 |
| 403 Forbidden | 无权限 | 普通用户访问管理员页面 | 权限不够,换账号或改角色 |
| 404 Not Found | 资源不存在 | URL 写错了 | 检查路径、文件名 |
| 500 Internal Server Error | 服务器内部错误 | 代码报错、数据库连不上 | 看响应体里的错误信息,找后端 |
| 502 Bad Gateway | 网关错误 | Nginx 连不上后端 | 检查后端服务是否挂了 |
| 503 Service Unavailable | 服务暂时不可用 | 服务器过载、维护中 | 等一会儿再试 |
一个小技巧: 抓包时看到 301/302,别只看第一个请求。浏览器会自动跟着 Location 头跳转,你要看的是最终的那个请求的状态码。我曾经排查一个登录问题,盯着 302 看了半天,完全忽略了后面的 500。
4.3 请求头与响应头:真正的信息宝藏
很多人抓包只看 URL 和状态码,忽略了头部信息。其实头部里藏着大量线索。我甚至可以说,80% 的问题排查,靠看头部就能解决。
4.3.1 常见的请求头
这是浏览器发请求时,自动带上的「自我介绍」:
| 请求头 | 作用 | 抓包时关注什么 |
|---|---|---|
Host |
目标域名 | 有没有被篡改(防 DNS 劫持) |
User-Agent |
客户端信息 | 是不是爬虫、模拟器 |
Referer |
来源页面 | 防盗链、防 CSRF |
Cookie |
会话标识 | 登录态、Session ID |
Authorization |
认证凭证 | Token、Basic Auth |
Content-Type |
请求体格式 | 是 JSON 还是表单 |
Accept |
期望的响应格式 | 要 JSON 还是 HTML |
4.3.2 常见的响应头
服务器返回的「回执说明」:
| 响应头 | 作用 | 抓包时关注什么 |
|---|---|---|
Content-Type |
响应体格式 | 是 HTML、JSON 还是图片 |
Content-Length |
响应体大小 | 文件是否完整下载 |
Set-Cookie |
设置 Cookie | 登录态、过期时间 |
Cache-Control |
缓存策略 | 资源能不能缓存、缓存多久 |
Location |
重定向地址 | 跳到哪里去了 |
Server |
服务器类型 | Nginx、Apache、IIS |
Access-Control-Allow-Origin |
CORS 跨域 | 接口是否允许跨域 |
抓包必看组合: 请求的 Cookie + 响应的 Set-Cookie。这两个头能告诉你:用户有没有登录、Session 有没有过期、Token 有没有被刷新。我排查过很多「明明登录了却提示未登录」的问题,最后发现是 Set-Cookie 的 Domain 写错了,浏览器根本没存上。
4.4 一张图看懂 HTTP 请求-响应全过程
说了这么多,咱们用一张 SVG 图把整个流程串起来。你盯着这张图看 30 秒,比看 10 页文档都管用。
4.5 实战:抓包时怎么看这些信息
光说不练假把式。我拿一个真实的抓包场景,带你走一遍。
假设你在浏览器里访问 https://example.com/login,输入用户名密码后点登录。抓包工具里你会看到什么?
- 第一个请求:GET 请求,获取登录页面 HTML。状态码 200。
- 后续请求:浏览器自动请求 CSS、JS、图片。注意看
Cache-Control,静态资源通常有缓存。 - 提交表单:POST 请求,
Content-Type: application/x-www-form-urlencoded,请求体里是username=xxx&password=xxx。 - 登录成功:服务器返回 302,
Location: /dashboard,同时Set-Cookie: sessionid=abc123; Path=/。 - 自动跳转:浏览器跟着 302 跳转到
/dashboard,这次请求的Cookie头里自动带上了sessionid=abc123。
注意: 如果你抓包时看到 POST 请求返回 302,但浏览器没有跳转,或者跳转后提示未登录。先检查 Set-Cookie 的 Domain 和 Path 对不对。我曾经遇到一个坑:服务器返回的 Set-Cookie 的 Domain 写的是 .example.com,但实际域名是 www.example.com,浏览器认为域名不匹配,直接丢弃了 Cookie。结果每次跳转后都像没登录一样。
4.6 本章小结
这一章内容不少,但你只需要记住三句话:
- 请求方法:GET 查、POST 写、PUT 全量更新、DELETE 删。别混用。
- 状态码:2xx 成功、3xx 跳转、4xx 客户端错、5xx 服务端错。看到 4xx 先查自己,看到 5xx 找后端。
- 头部信息:请求头看 Cookie 和 Content-Type,响应头看 Set-Cookie 和 Cache-Control。这两个组合能解决 90% 的会话和缓存问题。