HTTP方法的安全性和幂等性

说明:如有侵权,请联系删除

HTTP方法的安全性和幂等性

HTTP 协议规定了不同方法的安全特性和幂等特性,作为服务提供者的服务器必须为客户端提供这些特性。

安全性(Safety)

仅指该方法的多次调用不会产生副作用(即不会改变资源状态),不涉及传统意义上的"安全"。

安全的方法不会修改资源状态,尽管多次调用的返回值可能不同(例如资源被其他非安全方法修改过)。

幂等性(Idempotence)

指该方法多次调用返回的效果(形式)一致,客户端可以重复调用并期望获得相同的结果。

幂等的含义类似于编程语言中的 setter 方法:一次调用和多次调用产生的效果一致,都是对一个变量进行赋值。

两者的区别容易混淆,简单理解如下:

特性 判断标准 示例
安全性 发送请求是否会改变资源状态(不会改变 → 安全) GET、HEAD、OPTIONS
幂等性 多次执行是否产生相同效果(不会改变 → 幂等) GET、PUT、DELETE、HEAD、OPTIONS

安全性与幂等性总结图

可以认为安全的方法都是只读方法 (GET、HEAD、OPTIONS),不会改变资源状态,因此它们同时也是幂等的


DELETE方法的幂等性

DELETE 方法的语义表示删除服务器上的一个资源。

第一次删除成功后资源就不存在了,资源状态发生了改变,因此 DELETE 方法不具备安全性

然而 HTTP 协议规定 DELETE 方法是幂等的:

每次删除该资源都要返回状态码 200 OK

服务器端若要实现幂等的 DELETE 方法,必须记录所有已删除资源的元数据(Metadata),否则第二次删除时返回的响应可能是 404 Not Found,从而破坏幂等性。


PUT与POST的区别

PUT 和 POST 方法语义中都包含修改资源状态的意思,因此都不是安全的。

方法 是否安全 是否幂等 特点
PUT 重复执行结果相同(覆盖)
POST 重复执行结果不同(新建)

为什么 PUT 是幂等的而 POST 不是?

HTTP 协议规定:

  • POST 方法 :URL 指向资源的父级资源 ,待创建资源的 ID 信息在请求体中携带
    → 重复提交 POST 请求可能会创建多个不同资源。
  • PUT 方法 :URL 直接指向待修改资源。
    → 重复提交 PUT 请求只会对该 URL 指定的资源起作用,也就是只会创建或更新一个资源。

因此:

  • PUT 是幂等的:多次调用的结果一致(更新或覆盖相同资源)。
  • POST 不是幂等的:多次调用可能产生多个不同资源。

PUT 与 POST 的使用区别

在实践中有几种常见观点:

  1. POST 创建资源,用 PUT 更新资源;
  2. PUT 创建资源,用 POST 更新资源;
  3. PUT 与 POST 都可用于创建或更新。

这些争论其实不是"风格"问题,而是"语义"问题。
是否使用 PUT 或 POST,取决于操作是否幂等。

"Methods can also have the property of idempotence in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request."

即:如果一个方法重复执行多次,产生的效果是一样的,那么它就是幂等的。


举例说明

假设有一个博客系统提供一个 Web API:

http://superblogging/blogs/post/{blog-name}

发送一个 HTTP PUT 或 POST 请求,Body 中包含博文内容。

问题:该使用 PUT 还是 POST?

取决于服务的行为是否幂等:

  • 如果发送两次相同请求会生成两个不同的帖子POST(非幂等)
  • 如果后一个请求覆盖了前一个帖子PUT(幂等)

总结对比表

方法 是否安全 是否幂等 典型用途
GET ✅ 是 ✅ 是 获取资源
HEAD ✅ 是 ✅ 是 获取资源元数据
OPTIONS ✅ 是 ✅ 是 查询支持的方法
POST ❌ 否 ❌ 否 创建子资源、提交表单
PUT ❌ 否 ✅ 是 创建/更新指定资源
DELETE ❌ 否 ✅ 是 删除资源

结论:

  • 安全性:不修改资源状态。
  • 幂等性:多次调用效果一致。
  • PUT 与 DELETE 是幂等但不安全;
  • GET、HEAD、OPTIONS 既安全又幂等;
  • POST 既不安全也不幂等。
相关推荐
黑贝是条狗17 分钟前
用mormot2 orm模式搭建一个http服务验证设备的注册信息
网络·网络协议·http
脑壳疼___2 小时前
手写海康OpenApi签名规范,实现手动调用api(sdk:artemis-http-client)
网络·网络协议·http
while(1){yan}3 小时前
HTTP的数据报格式
java·开发语言·网络·网络协议·http·青少年编程·面试
爆肝疯学大模型3 小时前
http转https,免费快速申请证书并实现nginx配置
nginx·http·https
元气满满-樱4 小时前
Http概述
网络·网络协议·http
油丶酸萝卜别吃4 小时前
如何使用http-server --cors启动页面?
网络·网络协议·http
喵爸的小作坊21 小时前
StreamPanel:一个让 SSE 调试不再痛苦的 Chrome 插件
前端·后端·http
李少兄1 天前
从零开始全面掌握 HTTPS
网络协议·http·https
是垚不是土1 天前
基于Blackbox Exporter的网络服务黑盒监控体系实践
网络·数据库·安全·http·微服务·prometheus
那我掉的头发算什么1 天前
【javaEE】保姆级 HTTP 全解析:请求响应 + 状态码 + Fiddler 实操
网络·http·java-ee·fiddler