一个好的会话 cookie 会在序列化数据之前加上一个过期时间,然后使用应用程序的密钥在过期时间 + 序列化数据前面加上一个过期时间 + 序列化数据的 HMAC。
message = serialize_to_bytes(session_data)
random = random_bytes(16)
expiration = unix_timestamp_as_16_bytes(now + 2 * 60 * 60 /*2 hours*/)
signable = random + expiration + message
signature = HMAC-SHA256(application_key, signable)
signed_message = signature + signable
将signed_message
是不可伪造的。它将受到重放攻击2小时。如果签名的会话 cookie 在 2 小时内被黑客入侵,会话可能会无限延长。为了做得更好,你需要想出一个好的随机数方案。在具有多个 Web 服务器提供会话 cookie 的大型应用程序中,这将需要一个包含已用随机数的中央数据库,这可能很笨拙。
一定要设置 cookie 的secure
标志(这样它只在 HTTPS 请求中发送)和httponly
标志(这样它就不能直接用于 JavaScript)。
请务必始终使用 SSL。