我想设计一个Web应用程序,它可以保证安全身份验证,并且只向授权用户提供API访问权限。基本思路是简单地发送用户名和密码以使用户通过身份验证。并且用户可以使用session_id向服务器发出请求,而无需再次验证自己。
当然,这是非常不安全的。但据我现在所理解,为了不暴露用户的凭据,我们可以应用TLS(https)来加密它。
然而,在我研究的过程中,我熟悉了很多概念,例如 Base64,HMAC_SHA1,API密钥,OAuth1.0 。但我无法理解为什么我们需要除TLS以外的那些机制。任何人都可以帮助解释为什么TSL不足以确保身份验证和API访问是安全的吗?
答案 0 :(得分:0)
如果您的Web应用程序对用户进行身份验证,发出会话ID并在每次调用时验证ID,则安全会话可以正常工作。您可以将会话ID存储在每个请求都会发回的安全cookie中。
当您在其他域上使用API时,事情变得更加复杂。现在,您的Cookie不会自动发送到服务(same-origin policy)。当然,您可以在调用API时将会话ID粘贴到Authorization标头中。但现在您的API需要与同一后端存储区通信,以维护您的会话状态以验证授权。这个后端存储成为可扩展性和单点故障的瓶颈。
为了解决这个问题,现代协议(如OAuth2)会发布安全令牌。这些令牌为digitally signed(使用HMAC),如果签名成功验证,则接收方信任令牌。不需要后端调用来验证令牌,只需要一个简单的加密操作。
API密钥用于允许应用程序获取安全令牌,而无需依赖用户进行身份验证。将它们视为应用程序的密码。
使用安全令牌还允许您使用第三方授权服务器(如Facebook或Google等)并完全退出验证用户,存储密码,发放令牌等业务。