733 字
4 分钟
HTTP 方法的安全性与幂等性怎么区分
  1. 1计算机网络学习路线与文章导读
  2. 2网络分层模型与数据封装是怎么回事
  3. 3TCP/IP 四层模型与 OSI 七层模型
  4. 4IP 地址与 CIDR 子网怎么理解
  5. 5ARP 是什么?主机如何找到目标 MAC 地址
  6. 6IP 路由与默认网关是如何工作的
  7. 7TCP 和 UDP 有什么区别?如何选择
  8. 8TCP 握手、挥手和丢包重传分别解决什么问题
  9. 9TCP 三次握手与四次挥手
  10. 10TCP 流量控制和拥塞控制有什么区别
  11. 11TCP 为什么可靠:流量控制、拥塞控制与局限性
  12. 12TCP 丢包、粘包和拆包是什么
  13. 13HTTP/1.0、HTTP/1.1、HTTP/2 与 HTTP/3 有什么区别
  14. 14HTTP 请求包含哪些内容
  15. 15HTTP 中 GET 和 POST 有什么区别
  16. 16HTTP 方法的安全性与幂等性怎么区分本文
  17. 17HTTP 状态码与网络故障如何区分排查
  18. 18常见 HTTP 状态码与网站故障排查
  19. 19HTTP 和 HTTPS 有什么区别
  20. 20谈谈对 DNS 和 CDN 的理解
  21. 21从输入网址到网页显示发生了什么
  22. 22TCP 的 TIME_WAIT 状态有什么作用
  23. 23TCP 的 CLOSE_WAIT 状态是什么,过多如何排查
  24. 24TLS 1.3 握手过程是什么
  25. 25HTTPS 如何校验证书
  26. 26HTTP 强缓存和协商缓存怎么工作
  27. 27HTTP Keep-Alive 是什么,连接如何复用
  28. 28WebSocket 和 HTTP 有什么区别
  29. 29服务端如何解析 HTTP 请求的数据
  30. 30NAT 是什么?端口映射如何实现
  31. 31ICMP、ping 和 traceroute 分别做什么
  32. 32网络故障如何分层排查
  33. 33Cookie、Session、Token 与 JWT 有什么区别
  34. 34常见的登录鉴权方式有哪些
  35. 35什么是 SYN Flood 攻击

HTTP 方法语义不应只按“参数放 URL 还是请求体”记忆。安全方法表示客户端不要求、也不期望该请求改变服务器状态;幂等方法表示相同请求重复执行多次,其预期效果与执行一次相同。幂等不要求每次响应完全相同,也不禁止服务器记录访问日志等副作用。

方法常见语义安全幂等
GET获取表示是是
HEAD获取响应头是是
POST按资源处理提交内容,常用于创建/动作否通常否
PUT用请求表示创建或替换目标资源否是
PATCH对资源做局部修改否不保证,取决于补丁语义
DELETE删除目标资源否是

这些是协议语义,不保证每个应用都实现正确。例如 GET 不应被设计成“点击即扣款”;爬虫、预取和缓存可能自动发起 GET。PUT 重试通常应写入同一目标状态;POST 创建资源若每次生成新记录则不幂等,但可用业务幂等键实现重复提交防护。DELETE 第二次可能返回 404,但目标已删除这一预期效果仍可视为幂等。

浏览器通常对 GET 响应缓存,但是否可缓存还要看状态码和缓存头;POST 也不能简单说绝对不可缓存。方法语义和缓存规则应分别讨论。

重试策略应结合方法语义与业务键设计:网络超时只能说明客户端没及时收到响应,不能证明服务端没有执行。对于创建订单或支付等请求,可由客户端带唯一请求标识,服务端持久化处理结果并对同一标识去重。还要定义幂等键作用范围、有效期和参数冲突行为,避免把重复请求误当作不同业务。

常见追问#

安全方法等于没有任何副作用吗?#

不是。服务器可能写访问日志或统计数据;“安全”描述客户端请求的预期语义是不要求改变目标资源状态,不代表实现绝对零副作用。

幂等和安全有什么关系?#

安全方法通常也是幂等的,但反过来不成立。PUT、DELETE 通常幂等,却会改变资源状态,因此不是安全方法。

POST 能做幂等吗?#

可以通过服务端幂等键、请求去重或业务唯一约束实现重复提交保护,但这属于应用设计,不改变 POST 方法通常非幂等的通用语义。

PATCH 一定非幂等吗?#

不一定。把字段设置成固定值的补丁可以幂等;“余额增加 10”这种增量操作重复执行则不幂等,须看具体补丁语义。

HTTP 方法的安全性与幂等性怎么区分
https://blog.xqcherry.top/posts/interview/network/http-method-safety-idempotency/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0