JWT 令牌是否应该存储在 cookie、标头或正文中

信息安全 tls 验证 饼干 jwt
2021-08-24 17:27:49

存储传输和存储 JWT 令牌或任何身份验证令牌的最安全方法是什么?

有人告诉我将身份验证令牌作为 cookie 发送是安全的,但我不明白这将如何提供任何额外的安全性,而不是仅使用普通会话 ID cookie 进行身份验证,因为浏览器无论如何都会为所有传出请求包含该 cookie . 我误解了什么吗?

对我来说更有意义的是,如果令牌将存储在响应标头或正文中,然后以编程方式在客户端提取并手动添加到每个请求中。没有办法通过 HTTPS 连接拦截令牌,并且 CSRF 攻击变得不可能(无论如何我都会使用 CSRF 令牌)。当然身份验证令牌仍然可以被 XSS 攻击访问,但是 cookie 不是也容易受到这种攻击吗?

我不明白 cookie 中的令牌如何通过基于简单会话 ID cookie 的身份验证提供任何额外的安全性?我错过了一些信息吗?

2个回答

通过将令牌放入 cookie 并将该 cookie 设置为 HttpOnly,您可以防止恶意客户端脚本(即 XSS)访问 cookie - JavaScript 无法访问 HttpOnly cookie,浏览器将保护它并处理发送cookie 只到正确的来源。

https://www.owasp.org/index.php/HttpOnly

好的,让我们从了解什么是 JWT 开始(引自他们的网站):

JSON Web 令牌是一种开放的行业标准 RFC 7519 方法,用于在两方之间安全地表示声明。

JWT.IO 允许您解码、验证和生成 JWT。

JWT 的目标不是隐藏数据,而是向服务器证明你的身份。任何人都可以解码令牌,但他们不能创建假令牌,因为这需要密钥。服务器在尝试解码假令牌时会抛出异常,因为没有人知道你的私钥(我希望!)。

通常,令牌在 Authorization 标头中发送,如下所示:

Authorization: Bearer <the token>

然后你有许多库可以解析标题并为你提取所需的信息,具体取决于你的语言。