安全的Web身份验证和API访问

问题描述:

我想设计一个Web应用程序,它可以确保安全的身份验证,并且只允许授权用户访问API。基本思想是简单地发送用户名和密码来获得用户的认证。用户可以使用session_id向服务器发出请求,而无需再次对自己进行身份验证。安全的Web身份验证和API访问

当然,这是非常不安全的。但据我现在可以理解,为了不暴露用户的凭据,我们可以应用TLS(https)来加密它。

但是,在我研究的过程中,我了解了很多概念,例如Base64,HMAC_SHA1,API密钥,OAuth1.0。但我不明白为什么我们需要TLS以外的机制。任何人都可以解释为什么TSL不足以确保身份验证和API访问安全吗?

如果您的Web应用程序对用户进行身份验证,发出会话ID并在每次调用中验证身份验证,安全会话将正常工作。您可以将会话ID存储在每个请求发回的安全Cookie中。

当你的API在不同的域上时,情况会变得更加复杂。现在您的Cookie不会自动发送到服务(same-origin policy)。当您调用API时,您当然可以将会话ID粘贴在授权标头中。但是现在,您的API需要与维护会话状态的相同后端存储进行通信以验证授权。该后端存储成为可扩展性和单点故障的瓶颈。

为了解决这个问题,现代协议(如OAuth2)发布安全令牌。这些令牌是digitally signed(使用HMAC),并且如果签名验证成功,接收方信任令牌。验证令牌不需要后端调用,只需简单的加密操作即可。

API密钥用于允许应用程序获取安全令牌而不依赖于用户进行身份验证。将它们视为应用程序的密码。

使用安全令牌还允许您使用第三方授权服务器(如Facebook或Google等),彻底摆脱用户身份验证,存储密码,发放令牌等业务。