内存中的JWT访问令牌?

内存中的JWT访问令牌?,jwt,access-token,Jwt,Access Token,我花了很多时间在这上面,这是我第一次使用JWT,我真的需要你的一些想法 现在我将我的令牌存储在单独的httpOnly cookies中(我的访问令牌在15分钟后过期,7天后刷新令牌) 我已经读到,存储令牌的最安全的方法实际上是使用cookie作为刷新令牌,在内存中(比如在变量中)作为访问令牌 虽然我理解这是安全的,但我并不真正理解它在实践中是如何工作的。这是否意味着我们必须在每个请求上使用刷新令牌创建一个新的访问令牌?或者有没有一种方法可以使它有效并复制到新变量,直到它过期 我正在使用react

我花了很多时间在这上面,这是我第一次使用JWT,我真的需要你的一些想法

现在我将我的令牌存储在单独的httpOnly cookies中(我的访问令牌在15分钟后过期,7天后刷新令牌)

我已经读到,存储令牌的最安全的方法实际上是使用cookie作为刷新令牌,在内存中(比如在变量中)作为访问令牌

虽然我理解这是安全的,但我并不真正理解它在实践中是如何工作的。这是否意味着我们必须在每个请求上使用刷新令牌创建一个新的访问令牌?或者有没有一种方法可以使它有效并复制到新变量,直到它过期


我正在使用react和node顺便说一句。

我也花了几天时间阅读了这篇文章。 根据我收集的信息,解决方案如下:

  • 用户使用登录名和密码登录

  • 服务器生成一个长期保存的刷新令牌,作为HttpOnly Cookie存储,防止XSS攻击,因为Javascript无法访问该令牌

    • 理想情况下,服务器端可以使用某种类型的黑名单来防止重新使用尚未到期但已被替换的刷新令牌
  • 生成一个访问令牌,该令牌可以存储在localStorage中,也可以存储在内存中(在变量中)。访问令牌的有效期很短,只有几分钟

    • 如果存储在localStorage中,则令牌不会在重新加载页面/浏览器(F5)时消失。它也将在控制台/存储器中可见
    • 当使用localStorage检查用户是否经过身份验证时,代码将尝试从localStorage读取令牌,jwt_对其进行解码,并使用令牌中的数据设置一个用户变量
    • 由于令牌不是加密的,只是base64,因此可以在开发人员控制台中更改其值。如果权限发生更改,则仅呈现“角色:管理员”页面。如果令牌被篡改,API将负责检查权限并拒绝请求
    • 另外,如果它存储在一个变量中,那么它就不那么显眼了,在重新加载页面/浏览器时,它也会被删除
    • 使用变量时,为了避免在每个请求上刷新访问令牌,我们可以使用上下文API,方法是创建一个具有经过身份验证的用户上下文的组件,该组件将包装应用程序/路由器,然后在需要保护的每个页面上导入并使用此上下文,并在需要时重定向
  • 当访问令牌不再有效时,因为它已到期或已被擦除,API调用将被拒绝。拦截此调用,然后调用API刷新路由以使用刷新令牌生成新的访问令牌

    • 我使用axios和axios拦截器截获失败的请求,调用刷新路由,设置更新的访问令牌,然后重试失败的请求。(需要是GET请求以避免CSRF错误)
    • 此外(不是代替),setTimeout可用于每隔X分钟自动刷新访问令牌,以防止其过期
  • 要注销,请删除cookie(最终为黑名单)并擦除上下文/本地存储

  • 使用axios,
    axios.defaults.withCredentials=true
    确保cookie与请求一起发送,并且
    {headers:{'Authorization':`Bearer${access\u token}}}
    确保访问“Bearer”令牌与请求一起发送。这些可以设置为每个请求的默认值,也可以设置为每个请求的默认值


    我也花了好几天时间阅读了这篇文章。 根据我收集的信息,解决方案如下:

  • 用户使用登录名和密码登录

  • 服务器生成一个长期保存的刷新令牌,作为HttpOnly Cookie存储,防止XSS攻击,因为Javascript无法访问该令牌

    • 理想情况下,服务器端可以使用某种类型的黑名单来防止重新使用尚未到期但已被替换的刷新令牌
  • 生成一个访问令牌,该令牌可以存储在localStorage中,也可以存储在内存中(在变量中)。访问令牌的有效期很短,只有几分钟

    • 如果存储在localStorage中,则令牌不会在重新加载页面/浏览器(F5)时消失。它也将在控制台/存储器中可见
    • 当使用localStorage检查用户是否经过身份验证时,代码将尝试从localStorage读取令牌,jwt_对其进行解码,并使用令牌中的数据设置一个用户变量
    • 由于令牌不是加密的,只是base64,因此可以在开发人员控制台中更改其值。如果权限发生更改,则仅呈现“角色:管理员”页面。如果令牌被篡改,API将负责检查权限并拒绝请求
    • 另外,如果它存储在一个变量中,那么它就不那么显眼了,在重新加载页面/浏览器时,它也会被删除
    • 使用变量时,为了避免在每个请求上刷新访问令牌,我们可以使用上下文API,方法是创建一个具有经过身份验证的用户上下文的组件,该组件将包装应用程序/路由器,然后在需要保护的每个页面上导入并使用此上下文,并在需要时重定向
  • 当访问令牌不再有效时,因为它已到期或已被擦除,API调用将被拒绝。拦截此调用,然后调用API刷新路由以使用刷新令牌生成新的访问令牌

    • 我使用axios和axios拦截器截获失败的请求,调用刷新路由,设置更新的访问令牌,然后重试失败的请求。(需要是GET请求以避免CSRF错误)
    • 此外(不是代替),setTimeout可用于自动刷新访问令牌e