目录
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 GMTCache-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公钥固定):
- 绑定域名与特定公钥
- 防止伪造证书攻击
浙公网安备 33010602011771号