V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
andrew2558
V2EX  ›  编程

关于 refresh token 的问题?

  •  1
     
  •   andrew2558 · Jan 31, 2023 · 3429 views
    This topic created in 1192 days ago, the information mentioned may be changed or developed.

    我知道 refresh token 主要用于无感知的获取新的 access token ,但没有看到关于 refresh token 刷新的介绍,都是说 refresh token 过期后,需要用户重新登录。比如说我的 refresh token 过期时间设置为 7 天,那么也就是说不管怎样使用,客户每 7 天都必需要登录一次。

    但实际中,我们发现很少有这种情况。只要你天天使用,基本不会让你重新登录 那这些网站或 app 是如何做的呢?它们是有一套 refresh token 刷新机制还是其它的方法?

    18 replies    2023-01-31 14:34:22 +08:00
    rebang
        1
    rebang  
       Jan 31, 2023   ❤️ 1
    在使用 refresh token 刷新的同时,会返回一个新的 refresh token
    andrew2558
        2
    andrew2558  
    OP
       Jan 31, 2023
    @sunhuawei 你的意思是指 Access token 每次刷新的同时,也刷新 refresh token 并重新设置 refresh token 的过期时间吗?
    Tyaqing
        3
    Tyaqing  
       Jan 31, 2023   ❤️ 1
    第一个问题是网站大多数还是使用 cookie 来记录登录,jwt 也是一样,可以放在 cookie 里面,一般时长都会很大,并且访问会自动续期.
    第二个问题.refresh token 和 token 都是需要服务端存储的,鉴定和刷新是一套机制,并且有一个 jwt 规范你可以参考一下
    https://www.rfc-editor.org/rfc/rfc7519
    ttwxdly
        4
    ttwxdly  
       Jan 31, 2023   ❤️ 1
    每次 refresh 后会返回新的 refresh token ,refresh token 的生命周期要比 access token 长。 refresh token 也可以做成重复使用的,但是不推荐。
    0xC000009F
        5
    0xC000009F  
       Jan 31, 2023   ❤️ 1
    如果用的是 Spring Security 的话 AuthorizationServerEndpointsConfigurer.reuseRefreshTokens 可以配置刷新 access token 的时候可以同时刷新 refresh token
    andrew2558
        6
    andrew2558  
    OP
       Jan 31, 2023
    谢谢大家的回答,大家好像说的都是在刷新 access token 时同时更新 refresh token,这里就要一个问题了,如果 refresh token 存储在数据库,那么每次刷新 access token (时间相对较短)也同时刷新 refresh token,那么无疑对服务器是一个很大的开销。
    iX8NEGGn
        7
    iX8NEGGn  
       Jan 31, 2023 via iPhone   ❤️ 1
    @andrew2558 不是,token 是无状态的,干嘛要存服务端?
    LeegoYih
        8
    LeegoYih  
       Jan 31, 2023   ❤️ 1
    简单做法,每次获取 session 的时候给 access token 续期
    SethShi
        9
    SethShi  
       Jan 31, 2023   ❤️ 1
    1. access_token 过期七天才对, refresh_token 一般没这么短.
    2. 刷新 token 一般不会刷新 refresh_token, 刷新的是 access_token(需要用 refresh_token 刷新)
    3. 你完成可以把 refresh_token 设置为按年为单位的(只有当 access_token 过期才会在接口中传递 refresh_token, 所以比 access_token 安全, 完全可以设置有效期久一点).
    theqiang
        10
    theqiang  
       Jan 31, 2023   ❤️ 1
    OP 是不是对 token 有点误解,应该不用存 db 的吧
    centralpark
        11
    centralpark  
       Jan 31, 2023   ❤️ 1
    如果用 uuid 这种随机数做 token ,那肯定需要存到数据库,保留有效期和用户 ID 等数据。如果用 jwt 这类使用私钥签名的数据做 token ,那就不需要存出到数据库了,服务端不查库,拿私钥解析出来其中的数据即可。
    andrew2558
        12
    andrew2558  
    OP
       Jan 31, 2023
    @iX8NEGGn @theqiang 这个是 refresh token, 过期时间会比较长,所以要存起来,保证状态
    iX8NEGGn
        13
    iX8NEGGn  
       Jan 31, 2023
    @centralpark @andrew2558

    Token 这个术语不就是为了和 Session 区分开吗,如果服务端要维护状态那就叫 Session ,而不应该把它归类为 Token 的一种,这就 内存 和 外存 一样,发明这两个术语就是为了做区分,而有的人把 内存 叫做 运行内存,把 外存 叫做 储存内存,我很厌恶这种方式。
    andrew2558
        14
    andrew2558  
    OP
       Jan 31, 2023
    @andrew2558 是的,这里指的 refresh token 并不是严格意义上的 jwt, 可以是一个自定义算法生成的字符串
    andrew2558
        15
    andrew2558  
    OP
       Jan 31, 2023
    @iX8NEGGn 楼上 @错了
    iX8NEGGn
        16
    iX8NEGGn  
       Jan 31, 2023
    @centralpark @andrew2558 好吧,久不接触,理解错了,我好像 Token 把 JWT Token 搞混了
    giter
        17
    giter  
       Jan 31, 2023   ❤️ 1
    accessToken 存用户本地,refreshToken 可以存 Redis 中。accessToken 过期时间很短,refreshToken 过期时间很长。

    如果 accessToken 过期而 refreshToken 没有过期,则生成新的 accessToken 发给用户;
    如果 accessToken 与 refreshToken 双双过期,则让用户重新登录。
    giter
        18
    giter  
       Jan 31, 2023
    @giter #17

    在 accessToken 过期而 refreshToken 没有过期情况中,可以让 refreshToken 重置时长,也可以不重置。只要用户隔三差五地访问,就代表是个活跃用户,就尽量延长 refreshToken 的存活时间,以让 accessToken 无感知地发给用户,达到持久登录的效果
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1581 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 16:31 · PVG 00:31 · LAX 09:31 · JFK 12:31
    ♥ Do have faith in what you're doing.