【问题标题】:JWT Refresh TokenJWT 刷新令牌
【发布时间】:2026-01-10 11:20:06
【问题描述】:

用户身份验证的常见场景如下:

  1. 用户使用其凭据(用户名/密码)注册和登录
  2. 服务器验证用户的凭据,如果有效,返回access tokenrefresh token
  3. access token 会在进一步的请求中发送,如果它有效,服务器会使用请求的资源进行响应
  4. access token不再有效时,服务器请求客户端提供一个refresh token以便发出一个新的access token
  5. 服务器收到refresh token,可能会发生两件事:
    • 如果refresh token 有效,则向客户端发出一个新的access token
    • 如果不是,服务器请求用户进行身份验证

为了让客户端能够在每个请求中发送access token,令牌应该存储在浏览器存储(本地/会话存储)或cookies ,这使得它容易受到 XSS(跨站点脚本)攻击。如果我们为access token 设置较短的生命周期,这个问题可能会得到缓解。

然而,我的问题是关于refresh token。这个令牌应该有很长的生命周期,因为我们用它来获取新的access tokens,如果攻击者拦截它就会有问题。所以在客户端存储这个令牌可能不是一个好主意,对吧?

但是,有什么选择呢?

我们可以将它存储在带有“httpOnly”标志的 cookie 集中吗?但这不会使其容易受到 CSRF(跨站点请求伪造)攻击吗?

加密令牌并仍将其保存在浏览器存储中是否安全?

提前谢谢你。最好的问候!

【问题讨论】:

    标签: security cookies token xss csrf


    【解决方案1】:

    这使得它容易受到 XSS(跨站脚本)攻击。

    澄清一下,只有当您的网站上存在使这成为可能的漏洞时,cookie 才容易受到 XSS 攻击。

    我们可以将它存储在带有“httpOnly”标志的 cookie 集中吗?但不会 这使它容易受到 CSRF(跨站请求伪造)攻击?

    虽然httpOnly 标志不能用于CSRF protection 的某些形式,因为它需要在客户端进行访问,但将cookie 标记为httpOnly 不会以任何方式增加系统的风险- httpOnly 更严格。

    加密令牌并仍将其保存在浏览器存储中是否安全?

    并不是因为任何可以访问浏览器存储的人或任何事物都可以访问 cookie 值并呈现它。不管它采用什么形式——加密与否——只要它可以在没有外部密钥的情况下直接使用。不要太担心这一点 - 信任浏览器以确保其安全,但请确保您网站的其余部分尽可能安全。

    refresh token 被视为比访问令牌更敏感,这是对的。您可以将其存储在 cookie 中,但请确保将其设置为 httpOnly 并设置 secure 标志以确保仅通过加密的 HTTPS 连接传输。

    【讨论】:

    • 首先,感谢您的回复;)关于您的第一点,我想说的是,将令牌存储在 cookie 中会使其容易受到 XSS 攻击,因为此 cookie 会由客户端访问(获取令牌并在授权标头中使用它),因此不会设置“httpOnly”标志(允许防止 XSS)。这不对吗?
    • 关于你的第二点,我不确定我是否理解它。请你澄清一下好吗?再次感谢您;)
    • 是的,第一条评论是正确的。我只想改写它并说cookie“如果我的网站容易受到XSS攻击,可能会被劫持”。请参阅此OWASP article for a good explanation of CSRF。我说的是拥有 httpOnly cookie 不会让你容易受到 CSRF 的攻击。
    • 我明白了;)谢谢!