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 页文档都管用。

HTTP 请求-响应全过程 HTTP 请求-响应全过程 客户端(浏览器) 1. 构造请求 2. 添加请求头 3. 发送请求 4. 接收响应 5. 解析渲染 服务器 A. 解析请求 B. 处理逻辑 C. 生成响应 D. 添加响应头 E. 返回数据 网络传输 请求(GET/POST/PUT/DELETE) 响应(状态码 + 响应头 + 数据) 抓包工具就站在「网络传输」这个位置 能看到所有请求和响应的原始数据

4.5 实战:抓包时怎么看这些信息

光说不练假把式。我拿一个真实的抓包场景,带你走一遍。

假设你在浏览器里访问 https://example.com/login,输入用户名密码后点登录。抓包工具里你会看到什么?

  1. 第一个请求:GET 请求,获取登录页面 HTML。状态码 200。
  2. 后续请求:浏览器自动请求 CSS、JS、图片。注意看 Cache-Control,静态资源通常有缓存。
  3. 提交表单:POST 请求,Content-Type: application/x-www-form-urlencoded,请求体里是 username=xxx&password=xxx。
  4. 登录成功:服务器返回 302,Location: /dashboard,同时 Set-Cookie: sessionid=abc123; Path=/。
  5. 自动跳转:浏览器跟着 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% 的会话和缓存问题。