引入refresh_token 是因为 access_token曝光度高
看到有人说:对于需要用户登录才能访问的的页面,前端每次访问后端API都要携带access_token(一般放在header中),所以这就会导致access_token的曝光度比较高,不太安全,所以引入了 refresh_token。
但 access_token 通常不是被前端存放在 local_Storage 中吗? 这都不用谈曝光度,别人打开浏览器开发者工具,随时都拿得到啊
感觉 access_token 连加密都没必要做
个人认为,反正 access_token 要放在前端,也就是随便给人看,那只要 access_token 不放什么敏感信息,即便被不法分子拿到了,他也没啥用啊
因为不法分子拿到token无分是冒充用户身份调用后端API,这个只要后端做了 防重放 和 签名,不法分子就算拿到了token他也很难破这两个点
所以,感觉 access_token 只要不放敏感信息,连加密都没有必要做而有人说,因为refresh_token只是在access_token快过期时才会调用后端API换取新的access_token,曝光度比较低,所以引入了refresh_token!
首先,个人认为的流程是:
某次前端调用后端API时,后端告诉前端access_token失效了;
前端然后拿着之前存在local_storage中的 refresh_token再去后端拿一个新的access_token。这样看来,refresh_token 和 access_token 既然都被前端存在 local_storage 中,这曝光度一样样的,没啥区别了,都很容易被不法分子拿到
而如果我们将refresh_token放在后端,当access_token过期时,后端帮前端拿到它对应的 refresh_token,然后给它个新的access_token。那还不如别要refresh_token了,后端直接给前端新的acces_token就得了呗。
所以这里我想不通,refresh_token到底有什么意义?而且到处都在说 access_token和refresh_token不要曝光,尤其是refresh_token, 也是真没理解啥意思?
所以引入refresh_token 到底是啥原因 没搞懂
你对“非法用户”的理解有误。
你 F12 打开控制台、从 Network 或 LocalStorage 里把 AccessToken 复制出来,然后自己写个爬虫程序开始疯狂调接口。你这在 OAuth 看来其实是正儿八经的“合法用户” —— 这个 AccessToken 本来就是颁发给“你”的,“你”用这个 AccessToken 也没有访问到超越“你”这个用户权限的数据。“你”用了本就属于你自己的 AccessToken 去调接口,这是再“合法”不过的了。
至于你说你绕开了网站本来的业务逻辑,私自发出了请求,那这不是 OAuth 关心的,也不是 OAuth 能解决的问题。那是你自己业务上的“非法”,不是 OAuth 认为的“非法”。
OAuth 想规避的是中间人或者 CRSF 这种的“非法用户” —— 泄露了本不属于他的 AccessToken。其思路很简单,既然泄露不可避免,那就想办法把泄露的损失降低。于是乎就自然而然想到了缩短 AccessToken 有效期的办法。
想一想现实中是不是也是如此?比如你用网银转账,PIN 只有几分钟甚至几十秒的有效期,即便你的 PIN 被坏人偷看到了,他也只能在很短的时间内才能利用上。
但 AccessToken 变短就带来了新的问题:令牌过期了,可正常用户还在用着,总不能没事儿就让用户重新授权吧?于是乎自然而然想到了增加一个 RefreshToken 的方式。
P.S. RefreshToken 并不是解决 AccessToken 有效期变短带来的副作用的唯一方案,甚至 OAuth 2.0 里专门加粗强调了 “However, you may not need refresh tokens”。