1
3277
清楚的解释 Daniel Irvine :
另一 nice pictorial format 如何使用HTTP状态代码。 |
2
353
|
3
272
其他答案缺失的是,必须理解的是,在RFC2616上下文中的身份验证和授权仅指RFC2617的HTTP身份验证协议。HTTP状态代码不支持由RFC2617之外的方案进行身份验证,并且在决定是否使用401或403时不考虑该验证。 简而言之unauthorized表示客户端未通过RFC2617身份验证,服务器正在启动身份验证过程。Forbidden表示客户端已通过RFC2617身份验证且没有授权,或者服务器不支持请求的资源的RFC2617。 也就是说,如果您有自己的Roll登录过程并且从不使用HTTP身份验证,403总是正确的响应,401永远不应该使用。 详细和深入从RCF2616
和
首先要记住的是,本文档上下文中的“身份验证”和“授权”专门指的是来自RFC2617的HTTP身份验证协议。它们不涉及您自己使用登录页面创建的任何Roll身份验证协议等。我将使用“登录”来指由RFC2617以外的方法进行的身份验证和授权。 所以真正的区别不是问题是什么,或者即使有解决方案。区别在于服务器期望客户机接下来做什么。 401表示无法提供资源,但服务器请求客户端通过HTTP身份验证登录,并已发送回复头来启动进程。可能存在允许访问资源的授权,可能没有,但让我们尝试一下,看看会发生什么。 403表示无法提供资源,当前用户无法通过rfc2617解决此问题,无法尝试。这可能是因为已知没有足够的身份验证级别(例如,由于IP黑名单),但可能是因为用户已经过身份验证,并且没有权限。rfc2617模型是一个用户,一个凭证,因此用户可能拥有第二组可以授权的凭证的情况可能会被忽略。它既不建议也不暗示某种登录页面或其他非RFC2617身份验证协议可能有帮助,也可能没有帮助——这超出了RFC2616标准和定义。 |
4
105
根据 RFC 2616 (http/1.1)403在以下情况下发送:
换句话说,如果客户机可以通过身份验证访问资源,那么应该发送401。 |
5
95
Resource exists ? | | NO | | YES v v 404 Is logged-in (authenticated) ? or | | 401 NO | | YES 403 | | v v 401 Can access resource, permissions (authorized) ? (404 no reveal) | | or 301 NO | | YES redirect | | to login v v 403 OK 200, 301, ... (or 404: no reveal) 检查通常按以下顺序进行:
未经授权的 :状态代码(401),指示请求需要 认证 通常这意味着用户需要登录(会话)。服务器未知的用户/代理。可以与其他凭据一起重复。注意:这很容易混淆,因为它应该被命名为“未经身份验证”而不是“未经授权”。如果会话过期,登录后也可能发生这种情况。 特殊情况:可以用404代替404,以避免暴露资源的存在或不存在(credits@gingercodeninja) 被禁止的 :状态代码(403),指示服务器理解请求,但拒绝完成请求。服务器已知但具有的用户/代理 凭据不足 . 重复请求将不起作用,除非凭证发生更改,这在短时间内是不太可能的。 特殊情况:可使用404代替404,以避免显示资源的存在或不存在(credits@gingercodeninja) 找不到 :状态代码(404),指示请求的资源不可用。已知的用户/代理,但服务器不会显示有关该资源的任何信息,就像它不存在一样。重复不起作用。这是404的一个特殊用途(例如,Github就是这样做的)。 |
6
39
假设HTTP身份验证 ( WWW认证 和 授权 报头) 正在使用中 ,如果作为另一个用户进行身份验证将授予对请求的资源的访问权,则应返回401 unauthorized。 403禁止在禁止所有人访问资源或限制在给定网络或仅允许通过SSL访问资源时使用,只要与HTTP身份验证无关。 如果未使用HTTP身份验证 该服务是一个基于cookie的认证方案,就像现在的标准一样,然后应该返回403或404。 关于401,这是来自RFC7235(超文本传输协议(HTTP/1.1):身份验证):
403(和404)的语义随时间而变化。这是从1999年开始的(RFC 2616):
2014年,RFC7231(超文本传输协议(HTTP/1.1):语义和内容)改变了403的含义:
因此,403(或404)现在可能意味着任何事情。提供新凭据可能会有所帮助…或者可能不会。 我相信这一变化的原因是RFC2616假设在实际应用中使用HTTP身份验证时,今天的Web应用程序使用例如表单和cookie构建自定义身份验证方案。 |
7
25
这是一个古老的问题,但一个从未真正提出的选择是返回404。从安全的角度来看,投票率最高的答案有潜在的 information leakage vulnerability . 例如,假设所讨论的安全网页是系统管理页,或者更常见地说,是用户无权访问的系统中的记录。理想情况下,您不希望恶意用户知道那里有一个页面/记录,更不用说他们没有访问权限。当我构建这样的东西时,我将尝试在内部日志中记录未经身份验证/未经授权的请求,但返回404。 OWASP有一些 more information 关于攻击者如何使用此类信息作为攻击的一部分。 |
8
20
这个问题一段时间前就被问到了,但人们的思想还在继续。 Section 6.5.3 在本草案(由Fielding和Reschke撰写)中,状态代码403的含义与 RFC 2616 . 它反映了许多流行的Web服务器和框架使用的身份验证和授权方案中所发生的情况。 我强调了我认为最突出的一点。
无论您使用什么约定,重要的是在您的站点/API中提供一致性。 |
9
10
DR
实例
如果
阿帕奇
需要身份验证
(通过
如果
恩吉克斯
查找文件,但没有
访问权限
(用户/组)要读取/访问它,它将用
RFC(2616第10节)401未经授权(10.4.2)含义1: 需要验证
含义2: 身份验证不足
403禁止(10.4.4)含义: 与身份验证无关
更多细节:
|
10
9
您已经陈述了两个不同的案例;每个案例都应该有不同的回应:
基于收到的回复意见的RFC说明: 如果用户没有登录,那么他们是未经身份验证的,HTTP等价物是401,在RFC中被错误地称为未经授权。AS section 10.4.2 状态为 401未经授权 :
如果您未经身份验证,401是正确的回答。但是,如果您未经授权,在语义正确的意义上,403是正确的响应。 |
11
3
我认为重要的是要考虑到,对于浏览器来说,401会启动一个身份验证对话框,让用户输入新的凭证,而403则不会。浏览器认为,如果返回401,那么用户应该重新进行身份验证。所以401代表无效身份验证,403代表缺少权限。 在这种逻辑下,有些情况下,认证或授权会返回一个错误,其中重要的短语用粗体显示。
四百零一 :客户端应指定凭据。
四百 :这既不是401也不是403,因为语法错误应该总是返回400。
四百零一 :客户端应指定有效的凭据。
四百零一 :同样,客户端应指定有效的凭据。
四百零一 :这实际上与通常具有无效凭据相同,因此客户端应指定有效凭据。
四百零三 :指定有效凭据将不会授予对资源的访问权限,因为当前凭据已经有效,但仅没有权限。
四百零三 :这与凭据无关,因此指定有效凭据没有帮助。
四百零三 :如果客户端被阻止,则指定新凭据将不起任何作用。 |
12
2
这在我的头脑里比这里任何地方都简单,所以: 401:您需要http-basic-auth来查看这个。 403:你看不到这一点,HTTP基本身份验证也无济于事。 如果用户只需要使用您站点的标准HTML登录表单登录,401将不合适,因为它是特定于HTTP基本身份验证的。
我不建议使用403来拒绝访问
这将403保留为“您需要登录”。 换句话说,403意味着“这个资源需要某种形式的认证,而不是HTTP基本认证”。 https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2 |
13
0
考虑到最新的RFC对此事的看法( 7231 和 7235 )用例看起来很清楚(斜体字添加):
|
14
-4
在401对403的情况下,这已经被多次回答了。这本质上是一个“HTTP请求环境”辩论,而不是一个“应用程序”辩论。 您自己的登录问题(应用程序)似乎有问题。 在这种情况下,不登录不足以发送401或403,除非使用http auth与登录页(不绑定到设置http auth)。听起来您可能在寻找一个“201已创建”,有一个滚动您自己的登录屏幕(而不是请求的资源)来访问一个文件。这说明: “我听到了,它在这里,但是你可以试试这个(你不允许看到它)”。 |
Community wiki · REST应用程序中的基本身份验证 1 年前 |
Heathcliff · 访问NGRX中的HTTP头响应 2 年前 |
Adeel Miraj · 阿拉莫菲尔-授权持有人和授权海关 6 年前 |
Hiren Gohel PRASANNA KUMAR K G · 使用api调用时,Laravel如何解码HTTP请求正文内容类型:application/x-www-form-urlencoded 6 年前 |
Talkerbox · 如何在uwsgi日志中添加HTTP头 6 年前 |