验证现代 Web 应用程序的最常用方法是什么?
What is the most common way to authenticate a modern web app?
我正在使用 Spring、Spring 安全性编写 Web 应用程序 (REST API)。现在我有基本身份验证和使用用户名、密码和角色的非常简单的授权。我想改进安全层,但我没有这方面的经验。
当我查看 postman 以寻找可能的身份验证方法并在 google 上搜索时,我看到有这些选项:
- API键
- 不记名令牌
- 基本授权
- 摘要授权
- OAuth 1.0
- OAuth 2.0
- Hawk 授权
- AWS 签名
- NTLM 验证
Digest、Hawk、AWS 和 NTLM 似乎是非常具体的案例,所以我忽略了它们。
我只听说了一些关于 API 密钥、Bearer Token 和 OAuth 1.0.0 的一般信息,但是 OAuth 1.0 似乎已经过时或类似的东西(我的意思是,有2.0 版存在的原因)。
因此,我似乎有 3 种可能的变体:
- API键
- 不记名令牌
- OAuth 2.0
我的假设正确吗?现代 Web 应用程序中安全层使用最广泛的案例是什么?
我不要求对每个案例进行完整描述,只是一般性建议,也许 links\resources 可以看看。
我应该专注于什么?
你看到我的description\explanation有什么错误吗?
就网络应用而言,网络应用请求应该有状态,session是最常见的状态。
并且当我们考虑 REST API 的 请求时,首选是无状态的,但是要验证和识别用户或客户端,如 OP 所述,有很多方法.
下面解释了 REST API 中一些最常见的身份验证方法
1.Basic 授权
在基本身份验证中,用户发送由 base64 编码器编码的凭据。
凭据在授权 header 中发送,带有下面给出的基本前缀。
"Basic "+ encodeUsingBase64(username+":"+password)
如果您的 REST API 受基本身份验证保护,则不属于应用程序的用户(不存在于服务器数据库中的用户)无法访问受保护的资源。
理想情况下,基本身份验证仅适用于应用程序用户
2。 JWT/不记名令牌
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),其中服务器与客户端共享数字签名的令牌,应用程序用户和非应用程序用户都可以使用服务器端从令牌的有效负载中提取用户信息并使用其数据库条目验证授权的逻辑。这里 JWT 用例不限于某些实现有效负载也可以包含授权信息。单点登录是现在广泛使用 JWT 的功能。
与基本身份验证相比
基本身份验证是在每个请求中发送完整凭据(包括密码)的身份验证步骤。
JWT 是一个 post 身份验证步骤,其中经过身份验证的用户会收到一个不包含密码信息的签名令牌。
3。 API键
没有标准,可能是随机生成的字符串发给API的用户。不同发行人的用例会有所不同。讨论得很好here
4。 Oauth2.0
Oauth2 是不同的类别。用一句话来说 它不是关于保护所有应用程序 API 的安全,而是提供对 user resource
和 third party applications
的访问 consent of user
.
主要有4个部分。让我们以 Facebook 为例
1.授权服务器[Facebook]
2.资源服务器[Facebook和资源将成为您的个人资料]
3. 客户端 [Stack overflow、Quora、Candy crush、Subway Surfer 等]
4. 资源所有者[您(如果已通过身份验证)]
资源服务器可能包括安全和不安全的API。要访问受保护的 API 的客户端,需要 access_token 由授权服务器颁发。 access_token issued 是一个随机字符串,也与关联的用户一起存储在授权服务器数据库中,scope(read
, read_profile_info
, write
).
此处 资源所有者(您)同意授权服务器向客户端授予 access_token 范围(read
、read-profile
、post-to-my-timeline
等) (Quora
,Whosebug
,Candy-Crush
等)
oauth2.0的优势
- access_token 收到后会有认证和授权。因此,为 access_token.
提供特定范围会很有帮助
(比如堆栈溢出访问基本配置文件信息,candy crush 代表您访问更多信息,包括 posting 的范围)
- access_token 的寿命,refresh_token 的grant_type。
访问令牌的生命周期有限。如果客户端应用程序需要在单个访问令牌的生命周期之外访问资源,它可以获得刷新令牌。刷新令牌允许客户端应用程序获取新的访问令牌。
授予类型:(授权代码、隐式、密码、客户端凭据、刷新令牌)
注:
Oauth2 Auth 服务器不仅适用于 facebook 和 Google 等应用程序,而且您的应用程序可以设置 oauth2 服务器,并且您可以为您的客户端 access_token(集成您的 API 及其应用程序)具有不同的范围,基于 subscription/license.
的生命周期
5。摘要认证
我没有从事过摘要认证。 Refer this thread for more details
传输层安全要点
SSL
上述任何身份验证都与传输层安全性 (SSL) 相关,对于确保您在后续请求中传递的 credentials/token 不会被捕获为纯文本很重要。
X.509(优于 SSL)
SSL证书由服务器发送给客户端。(任何向服务器发出请求的客户端都会收到SSL副本。没有限制,任何客户端都可以收到SSL证书)。
但是如果 X.509 客户端证书是使用服务器 SSL 证书创建的,并且它是秘密地与客户端共享的。客户端使用 X.509 证书与服务器通信。这里有一点需要注意,对于不同的 cients 将生成不同的客户端证书以标识每个客户端。 X.509 确保的是
安全(没有客户端证书不能访问API的)
身份(服务器可以根据证书主题识别客户端)
基本和摘要式身份验证
在每个请求中,登录凭据将随请求一起发送 header。在基本身份验证中,用户名和密码(登录凭据)未加密。摘要认证使用加密密码。因此 digest Authentication 比
更安全
基本身份验证
用户名和密码使用“:”符号(“用户名:密码”)连接,此字符串使用 base64 编码后随请求发送 header。
这种方法实现简单,速度快,所有浏览器都支持。问题是base64不是一种加密方法,因此这种方法安全性差,有人可以轻松获得登录凭据。
摘要式身份验证
散列密码与 header 中的 nonce 值一起发送。 Nonce 值是服务器生成的随机值。
这种方法比基本认证方法更安全。此外,容易受到中间人的攻击。密码在服务器上不可靠,因为无法使用 bcrypt。
Session-Based 身份验证
每个请求都不需要用户提供用户名或密码。凭证验证后,服务器创建一个 session 并存储在内存中。此外,return 浏览器的 session Id 和浏览器存储 session Id 作为 cookie。
Token-Based 身份验证
此方法使用令牌而不是 cookie 对用户进行身份验证。令牌不必保存在服务器中。 JSON Web Token (JWT) 是使用最广泛的令牌。 JWT 包含三个部分。 header、负载和签名。
根据令牌在客户端计算机上的保存方式,存在不同的攻击。此外,令牌不可撤销。只能在过期前使用。
OAuth 和 OpenID
这是一种单点登录身份验证形式。用户可以使用来自社交网络的现有详细信息,而不是专门为该网站创建帐户,并且此方法使用 session-base 身份验证。主要优点是比其他方法安全,但这取决于另一个 third-party 应用程序。没有您设置的 OpenID 提供商帐户的用户将无法使用您的应用程序。
我正在使用 Spring、Spring 安全性编写 Web 应用程序 (REST API)。现在我有基本身份验证和使用用户名、密码和角色的非常简单的授权。我想改进安全层,但我没有这方面的经验。
当我查看 postman 以寻找可能的身份验证方法并在 google 上搜索时,我看到有这些选项:
- API键
- 不记名令牌
- 基本授权
- 摘要授权
- OAuth 1.0
- OAuth 2.0
- Hawk 授权
- AWS 签名
- NTLM 验证
Digest、Hawk、AWS 和 NTLM 似乎是非常具体的案例,所以我忽略了它们。
我只听说了一些关于 API 密钥、Bearer Token 和 OAuth 1.0.0 的一般信息,但是 OAuth 1.0 似乎已经过时或类似的东西(我的意思是,有2.0 版存在的原因)。
因此,我似乎有 3 种可能的变体:
- API键
- 不记名令牌
- OAuth 2.0
我的假设正确吗?现代 Web 应用程序中安全层使用最广泛的案例是什么?
我不要求对每个案例进行完整描述,只是一般性建议,也许 links\resources 可以看看。
我应该专注于什么?
你看到我的description\explanation有什么错误吗?
就网络应用而言,网络应用请求应该有状态,session是最常见的状态。
并且当我们考虑 REST API 的 请求时,首选是无状态的,但是要验证和识别用户或客户端,如 OP 所述,有很多方法.
下面解释了 REST API 中一些最常见的身份验证方法
1.Basic 授权
在基本身份验证中,用户发送由 base64 编码器编码的凭据。
凭据在授权 header 中发送,带有下面给出的基本前缀。
"Basic "+ encodeUsingBase64(username+":"+password)
如果您的 REST API 受基本身份验证保护,则不属于应用程序的用户(不存在于服务器数据库中的用户)无法访问受保护的资源。
理想情况下,基本身份验证仅适用于应用程序用户
2。 JWT/不记名令牌
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),其中服务器与客户端共享数字签名的令牌,应用程序用户和非应用程序用户都可以使用服务器端从令牌的有效负载中提取用户信息并使用其数据库条目验证授权的逻辑。这里 JWT 用例不限于某些实现有效负载也可以包含授权信息。单点登录是现在广泛使用 JWT 的功能。
与基本身份验证相比
基本身份验证是在每个请求中发送完整凭据(包括密码)的身份验证步骤。
JWT 是一个 post 身份验证步骤,其中经过身份验证的用户会收到一个不包含密码信息的签名令牌。
3。 API键
没有标准,可能是随机生成的字符串发给API的用户。不同发行人的用例会有所不同。讨论得很好here
4。 Oauth2.0
Oauth2 是不同的类别。用一句话来说 它不是关于保护所有应用程序 API 的安全,而是提供对 user resource
和 third party applications
的访问 consent of user
.
主要有4个部分。让我们以 Facebook 为例
1.授权服务器[Facebook]
2.资源服务器[Facebook和资源将成为您的个人资料]
3. 客户端 [Stack overflow、Quora、Candy crush、Subway Surfer 等]
4. 资源所有者[您(如果已通过身份验证)]
资源服务器可能包括安全和不安全的API。要访问受保护的 API 的客户端,需要 access_token 由授权服务器颁发。 access_token issued 是一个随机字符串,也与关联的用户一起存储在授权服务器数据库中,scope(read
, read_profile_info
, write
).
此处 资源所有者(您)同意授权服务器向客户端授予 access_token 范围(read
、read-profile
、post-to-my-timeline
等) (Quora
,Whosebug
,Candy-Crush
等)
- access_token 收到后会有认证和授权。因此,为 access_token.
提供特定范围会很有帮助 (比如堆栈溢出访问基本配置文件信息,candy crush 代表您访问更多信息,包括 posting 的范围) - access_token 的寿命,refresh_token 的grant_type。
访问令牌的生命周期有限。如果客户端应用程序需要在单个访问令牌的生命周期之外访问资源,它可以获得刷新令牌。刷新令牌允许客户端应用程序获取新的访问令牌。
授予类型:(授权代码、隐式、密码、客户端凭据、刷新令牌)
Oauth2 Auth 服务器不仅适用于 facebook 和 Google 等应用程序,而且您的应用程序可以设置 oauth2 服务器,并且您可以为您的客户端 access_token(集成您的 API 及其应用程序)具有不同的范围,基于 subscription/license.
的生命周期5。摘要认证
我没有从事过摘要认证。 Refer this thread for more details
传输层安全要点
SSL上述任何身份验证都与传输层安全性 (SSL) 相关,对于确保您在后续请求中传递的 credentials/token 不会被捕获为纯文本很重要。
X.509(优于 SSL)SSL证书由服务器发送给客户端。(任何向服务器发出请求的客户端都会收到SSL副本。没有限制,任何客户端都可以收到SSL证书)。
但是如果 X.509 客户端证书是使用服务器 SSL 证书创建的,并且它是秘密地与客户端共享的。客户端使用 X.509 证书与服务器通信。这里有一点需要注意,对于不同的 cients 将生成不同的客户端证书以标识每个客户端。 X.509 确保的是
安全(没有客户端证书不能访问API的)
身份(服务器可以根据证书主题识别客户端)
基本和摘要式身份验证
在每个请求中,登录凭据将随请求一起发送 header。在基本身份验证中,用户名和密码(登录凭据)未加密。摘要认证使用加密密码。因此 digest Authentication 比
更安全基本身份验证
用户名和密码使用“:”符号(“用户名:密码”)连接,此字符串使用 base64 编码后随请求发送 header。 这种方法实现简单,速度快,所有浏览器都支持。问题是base64不是一种加密方法,因此这种方法安全性差,有人可以轻松获得登录凭据。
摘要式身份验证
散列密码与 header 中的 nonce 值一起发送。 Nonce 值是服务器生成的随机值。 这种方法比基本认证方法更安全。此外,容易受到中间人的攻击。密码在服务器上不可靠,因为无法使用 bcrypt。
Session-Based 身份验证
每个请求都不需要用户提供用户名或密码。凭证验证后,服务器创建一个 session 并存储在内存中。此外,return 浏览器的 session Id 和浏览器存储 session Id 作为 cookie。
Token-Based 身份验证
此方法使用令牌而不是 cookie 对用户进行身份验证。令牌不必保存在服务器中。 JSON Web Token (JWT) 是使用最广泛的令牌。 JWT 包含三个部分。 header、负载和签名。 根据令牌在客户端计算机上的保存方式,存在不同的攻击。此外,令牌不可撤销。只能在过期前使用。
OAuth 和 OpenID
这是一种单点登录身份验证形式。用户可以使用来自社交网络的现有详细信息,而不是专门为该网站创建帐户,并且此方法使用 session-base 身份验证。主要优点是比其他方法安全,但这取决于另一个 third-party 应用程序。没有您设置的 OpenID 提供商帐户的用户将无法使用您的应用程序。