🌐 HTTP / HTTPS
HTTP 版本演进 · 状态码 · HTTPS 与 TLS 握手 · Cookie/JWT
1. HTTP 1.0 / 1.1 / 2.0 / 3.0 的区别?
- HTTP/1.0:无连接,每次请求新建 TCP 连接(性能差)
- HTTP/1.1:
- 持久连接(keep-alive):默认复用连接
- 管线化:可连续发多个请求,但响应仍要按序返回(队头阻塞)
- Host 头(一台服务器多域名)
- HTTP/2.0:
- 多路复用:一个 TCP 连接上并发多个流(二进制分帧),解决队头阻塞(应用层)
- 头部压缩(HPACK)、服务端推送(Server Push)
- 仍受 TCP 层队头阻塞影响(丢一个包,所有流等重传)
- HTTP/3.0:基于 QUIC(UDP)——连接迁移、0-RTT、彻底无队头阻塞
🎯 面试要点
- 队头阻塞两处:HTTP/1.1 应用层按序响应;TCP 层丢包重传阻塞——HTTP/3 用 UDP 解决后者
- GET vs POST:语义差异(幂等/缓存/长度),不是"哪个更安全"
- HTTP 方法幂等性:GET/PUT/DELETE 幂等,POST 不幂等
2. 常见 HTTP 状态码?
- 2xx:200 OK、201 Created、204 No Content(无响应体)
- 3xx:301 永久重定向(缓存)、302 临时重定向、304 Not Modified(缓存协商命中)
- 4xx:400 参数错误、401 未认证、403 无权限(禁止)、404 不存在、405 方法不允许、429 限流
- 5xx:500 服务端错误、502 Bad Gateway(网关/代理拿不到上游)、503 服务不可用(过载/维护)、504 网关超时
🎯 面试要点
- 401 vs 403:401"你是谁"(认证),403"你是谁也不行"(授权)——经典区分
- 301 vs 302:301 会更新书签缓存,302 每次重新请求
- 504 vs 502:504 是网关等了太久没等到上游响应(上游超时),502 是上游返回了非法响应
3. HTTPS 为什么安全?TLS 握手过程?
要解决的三个问题:加密(防窃听)、完整性(防篡改)、身份认证(防冒充)。
TLS 1.2 握手(简化):
- 客户端 → 服务端:ClientHello(支持的加密套件、随机数 A)
- 服务端 → 客户端:ServerHello(选定套件、随机数 B)+ 证书(含公钥)
- 客户端校验证书(信任链 → CA 根证书)→ 生成预主密钥(pre-master secret)→ 用服务端公钥加密发送
- 双方用 A+B+C 算出对称会话密钥(非对称加密只用于密钥交换)
- 此后用对称加密(AES)传输数据(性能)
核心思想:非对称加密安全交换密钥 → 对称加密高效传输数据(混合加密)。
🎯 面试要点
- 证书验证链:浏览器信任根 CA → 逐级验证签名 → 确认服务端身份,防中间人(MITM)
- TLS 1.3 简化:1-RTT 建立(省略部分往返),密钥交换用 ECDHE(前向安全)
- http → https 部署注意:证书绑定域名、TLS 终止在 Nginx/网关、HSTS
4. Cookie / Session / Token(JWT)?
- Cookie:客户端存储的小数据(浏览器),随请求自动携带(Domain/Path/HttpOnly/Secure/SameSite 属性)
- Session:服务端存储会话数据,sessionId 通过 Cookie 传递。问题:多实例部署要共享 Session(Session 粘滞/Redis 集中式)
- JWT(Token):无状态——服务端不存会话,签名(HMAC/RSA)防篡改,携带用户信息。三段:Header.Payload.Signature。优点:天然分布式、跨端(App/Web);缺点:无法主动失效(登出要黑名单)、体积大、敏感信息别放 Payload
JWT 结构
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjEwMH0.signture...
// Header(算法) . Payload(claims,base64) . Signature
// Signature = HMACSHA256(header + "." + payload, 密钥)
// 服务端验签即可确认内容未被篡改(无需查库)
🎯 面试要点
- Session 与 JWT 的取舍:服务端可控制(Session)vs 无状态扩展(JWT)
- 安全细节:Cookie 加 HttpOnly(防 XSS 偷)、SameSite(防 CSRF)、JWT 过期时间要短 + refresh token
- SSO/网关鉴权场景用 JWT 主流