我想知道哪个更安全地实施身份验证?&为什么?基于会话的认证或基于令牌的认证
我知道会话也可以用于其他事情,但是对……
在基于会话的身份验证中,服务器完成所有繁重的服务器端。从广义上讲,客户端使用其凭据进行身份验证并接收session_id(可以存储在cookie中)并将其附加到每个后续传出请求。因此,这可以被视为“令牌”,因为它相当于一组凭据。
然而,这个session_id-String没什么特别之处。它只是一个标识符,服务器完成其他所有操作。这是有状态的。它将标识符与用户帐户相关联(例如,在存储器中或在数据库中)。它可以将此会话限制或限制为某些操作或特定时间段,并且如果存在安全问题则可以使其无效,更重要的是,它可以动态地执行和更改所有这些操作。
此外,它可以记录用户在网站上的每一个动作。可能的缺点是可扩展性差(特别是在多个服务器场上)和大量内存使用。
在基于令牌的身份验证中,没有会话持久存储在服务器端(无状态)。最初的步骤是一样的。凭证交换凭证,然后将其附加到每个后续请求(它也可以存储在cookie中)。
然而,为了减少内存使用,简单的扩展能力和总灵活性(令牌可以与另一个客户端交换),发出一个包含所有必要信息的字符串(令牌),在客户端发出的每个请求之后检查该字符串。服务器。
有许多方法可以使用/创建令牌:
使用散列机制,例如HMAC-SHA1
token = user_id|expiry_date|HMAC(user_id|expiry_date, k)
--id和expiry_id以明文形式发送,附加结果哈希(k只知道服务器)
对称地加密令牌,例如用AES
token = AES(user_id|expiry_date, x)
--x表示加密/解密密钥
不对称地加密它,例如与RSA
token = RSA(user_id|expiry_date, private key)
生产系统通常比这两种原型更复杂。例如亚马逊在其网站上使用这两种机制。此外,混合物可以用于发布令牌,如2中所述,并且还将用户会话与其关联以用于用户跟踪或可能的撤销,并且仍然保持经典令牌的客户端灵活性。此外,OAuth 2.0使用短期和特定的承载令牌和更长寿命的刷新令牌,例如获得持票人代币。
的 资料来源: 强>