get 与 post的安全性与幂等性

从协议标准上来看,GET 和 POST 的主要区别如下:
GET 用于获取信息,是无副作用的,是幂等的,且可缓存
POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存

报文结构

实际上,GET 和 POST 只是 HTTP 协议中两种请求方式,而 HTTP 协议是基于 TCP/IP 的应用层协议,无论 GET 还是 POST,用的都是同一个传输层协议,所以在传输上,没有区别。当不带参数时,两者的区别就仅仅是报文的前几个字符不同而已:
GET / 资源路径 HTTP / 协议版本
POST / 资源路径 HTTP / 协议版本
带参数时, 在约定中,GET 方法的参数应该放在 url 中,POST 方法参数应该放在 body 中。实际上不按规范来也是可以的,我们可以在 url 中写参数,方法使用 POST;也可以在 body 中写参数,方法使用 GET。

操作意图

GET 请求方法表明客户端希望从服务器获取指定资源,而 POST 请求方法则意味着客户端要向服务器提交数据,对资源进行处理或修改。也就是说:
使用GET请求时,服务器上的资源的状态都不会发生改变(安全性),同时,即使是同样的请求报文,一次和多次获得的结果都是一样的(幂等性);
使用POST请求时,服务器的资源状态已经改变了(不安全),同样的POST报文都会造成资源状态的变化(不幂等),比如在购物时,重复的POST报文会造成重复下单。

结论

GET和POST只是协议推荐的方法,即获取数据使用GET,修改资源使用POST。实际上完全可以构造不安全,不幂等的GET请求 和 安全、幂等的POST请求。
不过从整个协议上来看:

  • GET 请求可以被浏览器或中间代理缓存,这有助于提高查询效率和性能。POST 请求通常不会被缓存,这可能导致不必要的重复请求和服务器负载。
  • 由于语义规范,浏览器会缓存 GET 请求的结果,因此可能用户看到的结果并没有实际被服务器执行。
    假定构造请求:
GET /api/transfer?from_user=123&to_user=456&amount=100 HTTP/1.1
Host: bank.example.com

目的是从用户 123 的账户向用户 456 的账户转账 100 元。
假设服务器对这个 GET 请求的响应被缓存了,如果后续用户再次发起相同的 GET 请求,浏览器可能会直接返回缓存的响应,而 不是重新向服务器发起请求,这就导致了不一致。

posted @ 2025-06-07 17:10  名字好难想zzz  阅读(83)  评论(0)    收藏  举报