通过HTTPS发送密码:GET与POST的区别

7
我正在创建一个无头API,用于驱动Angular前端。但是我在处理用户身份验证时遇到了一些问题。
显然,API应该在SSL上运行,但是出现的问题是:我应该如何发送包含用户密码的请求:使用GET还是POST?它是一个RESTful API,因此我正在检索信息,这意味着它应该获得一个GET请求。但是通过get发送密码意味着它是URI的一部分,对吗?我知道即使是GET请求也会在HTTPS上加密,但这仍然是正确的方式吗?还是这是一种打破RESTful规则的情况,需要将数据放在正文中或其他地方(GET请求可以有正文数据吗?)。
3个回答

6
如果您在请求标头中传递凭据,则无论使用GET还是POST请求都可以。您可以选择使用已建立的Authorization标头和您选择的认证方案,或者创建特定于您的API的自定义标头。
使用标头字段作为通信凭据的手段时,您不需要担心凭据被写入访问日志,因为标头不包括在该日志中。使用标头字段也符合REST标准,并且实际上应该用于通信与资源请求/响应相关的任何元数据。这种元数据可以包括但不限于以下信息:集合大小、分页详细信息或相关资源的位置。
总之,始终将标头字段用作身份验证/授权手段。

有趣。我在传递我的JWT时确实使用了Authorization头部,正如预期的那样,但我没有意识到它也是用于初始身份验证的标准做法。 - Rohit

4
大多数GET请求会在URL中绑定数据...所以它比POST更易读。 因此,如果是GET,就有可能保存历史日志
使用?user=myUsername&pass=MyPasswort与使用基于GET的表单完全相同,虽然Referer问题可以得到解决,但日志和历史记录方面的问题仍然存在。
通过GET发送任何类型的敏感数据都很危险,即使使用HTTPS也是如此。这些数据可能会出现在服务器的日志文件中,并包含在链接到其他站点或包含其他站点的Referer头中。它们还将保存在浏览器的历史记录中,因此攻击者可能会尝试使用针对历史记录的攻击来猜测和验证链接的原始内容。

即使是通过 AJAX 发送的 GET 请求,浏览器是否仍会保存数据? - Rohit
1
在GET请求的URL中发送敏感数据是危险的,这是因为正如你所说,URL会被记录在服务器上。然而,在GET请求的头部字段中发送敏感数据是可以的,只要您使用HTTPS进行通信。 - Joshua Jones

1
你也可以在GET请求中发送数据主体,但我猜不是所有的库都支持这个功能。
最好使用POST或请求头。查看其他API以及它们如何处理它。
但你仍然可以像这里一样使用基本身份验证的GET:http://restcookbook.com/Basics/loggingin/

在这种情况下最好打破REST吗? - Rohit
1
我更新了我的回答。我认为这并不太重要。而且我觉得在这种情况下你不会破坏REST。这有点灰色地带 :) 但是你可以使用基本身份验证。 - lumio
POST 不一定更好。它将取决于针对资源采取的操作。 - Joshua Jones
好的。我认为最好的方法是使用基本身份验证或通过HTTP头部发送某种API令牌。 - lumio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接