目录
HTTP协议基础概念
HTTP请求方法详解
HTTP报文结构
HTTP与HTTPS的区别
HTTP协议
HTTPS协议
HTTP/2的主要特性
1. 二进制分帧传输
2. 多路复用
3. 头部压缩(HPACK算法)
4. 服务器推送
HTTP协议核心概念详解
常见头部字段
请求头字段
响应头字段
缓存机制详解
强缓存机制
协商缓存机制
Cookie与Session机制
Cookie技术细节
Session技术细节
RESTful API设计规范
核心原则
最佳实践
Web安全防护
CSRF(跨站请求伪造)防御
XSS(跨站脚本攻击)防御
中间人攻击防护
HTTP协议基础概念
HTTP(HyperText Transfer Protocol)是一种用于传输超文本的应用层协议,基于客户端-服务器模型工作。默认端口为80(HTTPS为443),采用请求-响应模式。
HTTP请求方法详解
GET
- 用于请求指定资源,是最常用的请求方法
- 参数通过URL的查询字符串(query string)传递,如:
/user?id=123
- 特点:安全(不修改数据)、幂等、可缓存
- 示例场景:获取文章详情、搜索商品等
POST
- 用于向服务器提交数据
- 数据包含在请求体(body)中,支持多种格式(JSON、XML、表单等)
- 特点:非幂等、通常会导致服务器状态改变
- 示例场景:用户注册、提交表单、上传文件等
PUT
- 用于完整替换目标资源的所有内容
- 需要提供完整的资源表示
- 特点:幂等(多次调用效果相同)
- 示例场景:更新用户全部信息
DELETE
- 用于删除指定资源
- 特点:幂等
- 示例场景:删除文章、移除购物车商品
HEAD
- 类似于GET,但服务器只返回响应头
- 常用于检查资源是否存在或获取资源元数据
- 示例场景:检查文件是否修改(通过Last-Modified头)
OPTIONS
- 用于获取目标资源支持的请求方法
- CORS(跨域资源共享)中常用
- 示例场景:预检请求(preflight request)
HTTP状态码分类详解
1xx 信息性状态码
表示请求已被接收,需要继续处理
- 100 Continue:客户端应继续发送请求体
- 101 Switching Protocols:服务器同意切换协议
2xx 成功状态码
表示请求已成功被服务器接收、理解并接受
- 200 OK:标准成功响应
- 201 Created:资源创建成功(通常用于POST)
- 204 No Content:成功但无返回内容(常用于DELETE)
3xx 重定向状态码
表示需要客户端采取进一步操作
- 301 Moved Permanently:永久重定向
- 302 Found:临时重定向
304 Not Modified:资源未修改(缓存相关)
4xx 客户端错误
表示客户端请求有问题
- 400 Bad Request:请求语法错误
- 401 Unauthorized:需要认证
- 403 Forbidden:服务器拒绝请求
- 404 Not Found:资源不存在
- 429 Too Many Requests:请求过于频繁
5xx 服务器错误
表示服务器处理请求出错
- 500 Internal Server Error:通用服务器错误
- 502 Bad Gateway:网关或代理服务器收到无效响应
- 503 Service Unavailable:服务器暂时过载或维护
- 504 Gateway Timeout:网关超时
HTTP报文结构
请求报文示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
响应报文示例:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
...
HTTP与HTTPS的区别
HTTP协议
- 数据传输方式:明文传输,不进行任何加密处理,请求和响应内容可被第三方轻易截获和查看
- 安全性:无加密机制,存在数据泄露、中间人攻击等安全风险
- 端口号:默认使用80端口
- 典型场景:适用于不涉及敏感信息的简单网页浏览,如新闻网站、博客等
HTTPS协议
- 数据传输方式:通过SSL/TLS协议进行加密传输,保护数据完整性
- 安全性:
- 提供端到端加密,防止数据在传输过程中被窃取或篡改
- 支持身份验证,确保访问的是真实服务器而非钓鱼网站
- 端口号:默认使用443端口
- 证书要求:
- 需要向证书颁发机构(CA)申请数字证书
- 证书验证网站身份并建立加密连接
- 典型场景:适用于电子商务、网银、登录系统等需要安全传输的场景
HTTP/2的主要特性
1. 二进制分帧传输
- 将HTTP消息分解为更小的二进制帧(Frame)进行传输
- 帧类型包括:HEADERS帧、DATA帧、PRIORITY帧等
- 优势:比HTTP/1.x的文本格式更高效,解析速度更快
2. 多路复用
- 允许在单个TCP连接上并行交错地发送多个请求和响应
- 解决了HTTP/1.x的队头阻塞问题
- 示例:一个页面可以同时加载CSS、JS和图片资源,而无需建立多个连接
3. 头部压缩(HPACK算法)
- 使用HPACK算法压缩HTTP头部
- 维护静态表和动态表来减少重复传输
- 效果:典型情况下可减少50-90%的头部开销
4. 服务器推送
- 服务器可以主动向客户端推送资源,而无需等待客户端请求
- 应用场景:推送CSS、JS等关键资源,减少页面加载时间
- 实现方式:通过PUSH_PROMISE帧告知客户端即将推送的资源
HTTP协议核心概念详解
常见头部字段
请求头字段
Accept:客户端可接受的响应内容类型
- 示例:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- 服务器会根据此字段返回最适合的响应类型
- 可以通过q参数指定不同类型优先级(0-1)
- 示例:
Cookie:携带客户端存储的会话信息
- 格式:
Cookie: name=value; name2=value2
- 每次请求自动携带,有大小限制(通常4KB左右)
- 可以设置Domain和Path限制范围
- 格式:
响应头字段
Set-Cookie:服务器设置客户端Cookie
- 格式:
Set-Cookie: <name>=<value>[; expires=<date>][; domain=<domain>][; path=<path>][; Secure][; HttpOnly]
- 重要属性:
- Expires/Max-Age:设置过期时间
- Secure:仅HTTPS传输
- HttpOnly:禁止JavaScript访问
- 格式:
Cache-Control:控制缓存行为
- 常用指令:
- public/private:资源是否可被中间代理缓存
- no-cache:需要先验证再使用缓存
- max-age=<seconds>:缓存有效时间
- no-store:禁止任何缓存
- 常用指令:
缓存机制详解
强缓存机制
实现方式:
Expires
(HTTP/1.0):绝对时间,如Expires: Wed, 21 Oct 2023 07:28:00 GMT
Cache-Control
(HTTP/1.1):相对时间,如Cache-Control: max-age=3600
工作流程:
- 浏览器检查缓存中的资源
- 如果未过期,直接使用缓存(状态码200 from cache)
- 如果已过期,向服务器发起请求
协商缓存机制
Last-Modified/If-Modified-Since:
- 服务器返回
Last-Modified: <date>
- 下次请求携带
If-Modified-Since: <date>
- 服务器比较时间决定返回304或新资源
- 服务器返回
ETag/If-None-Match:
- 服务器返回资源指纹
ETag: "5d8c72a5edda8"
- 下次请求携带
If-None-Match: "5d8c72a5edda8"
- 服务器比较ETag决定返回304或新资源
- 服务器返回资源指纹
Cookie与Session机制
Cookie技术细节
- 存储位置:客户端浏览器
- 传输方式:HTTP头部自动携带
- 限制:
- 大小:约4KB
- 数量:每个域名约50个(浏览器差异)
- 安全性:可设置Secure和HttpOnly属性
- 生命周期:
- 会话Cookie:浏览器关闭失效
- 持久Cookie:根据Expires/Max-Age设置
Session技术细节
- 存储位置:服务端内存/数据库
- 实现方式:
- 生成唯一Session ID(通常32位随机字符串)
- 通过Set-Cookie返回给客户端
- 后续请求携带Session ID识别用户
- 安全性:
- 定期更换Session ID
- 设置合理过期时间
- 重要操作需二次验证
RESTful API设计规范
核心原则
HTTP方法语义化:
- POST:创建资源
- GET:获取资源
- PUT:完整更新资源
- PATCH:部分更新资源
- DELETE:删除资源
URI设计规范:
- 使用名词而非动词:
/users
优于/getUsers
- 层级表示关系:
/users/123/posts
- 避免特殊字符,使用连字符
-
而非下划线_
- 使用名词而非动词:
状态码使用:
- 200 OK:成功请求
- 201 Created:资源创建成功
- 204 No Content:成功但无返回体
- 400 Bad Request:客户端错误
- 401 Unauthorized:未认证
- 403 Forbidden:无权限
- 404 Not Found:资源不存在
- 500 Internal Server Error:服务器错误
最佳实践
- 版本控制:
/api/v1/users
- 过滤排序:
/users?age=25&sort=-createdAt
- 分页:
/users?page=2&limit=10
- 返回格式统一:
{ "data": [...], "meta": { "total": 100, "page": 2, "limit": 10 } }
Web安全防护
CSRF(跨站请求伪造)防御
验证Referer:
- 检查请求来源是否合法域名
- 简单但不可靠(Referer可能被篡改)
Token验证:
- 服务器生成随机Token
- 通过Cookie或表单隐藏域传递
- 每次请求验证Token有效性
SameSite Cookie属性:
SameSite=Strict
:完全禁止第三方CookieSameSite=Lax
:宽松模式(默认)SameSite=None
:允许跨站,需配合Secure
XSS(跨站脚本攻击)防御
输入过滤:
- 转义特殊字符:
< > & " '
- 白名单验证:只允许特定格式输入
- 转义特殊字符:
输出编码:
- HTML实体编码:
< → <
- JavaScript编码:
\x3cscript\x3e
- URL编码:
%3Cscript%3E
- HTML实体编码:
内容安全策略(CSP):
- 通过HTTP头限制资源加载
- 示例:
Content-Security-Policy: default-src 'self'
中间人攻击防护
HTTPS加密:
- 使用TLS/SSL加密传输
- 配置HSTS强制HTTPS
证书验证:
- 使用可信CA颁发的证书
- 浏览器验证证书有效性
HPKP(HTTP公钥固定):
- 绑定域名与特定公钥
- 防止伪造证书攻击