关于token的一些记录
前段时间偶然看到一篇关于accessToken和refreshToken的讨论帖,了解到了这两个Token的区别,还顺带了解了一些关于OAuth2.0
标准的内容,简单记录一下,方便后面复习。本文只是写给我自己看的,因为我也是根据网上的文章自己总结的,可能有误,可以直接去看网上写得更详细的文章
Cookie、Session和Token
参考文章:一文讲透Token与Cookie、Session的区别
为啥会有这几个东西呢,是因为http协议是无状态的协议,两个http请求之间没有联系,假如有很多个http请求,我们该如何区分这些个请求是属于哪个用户的,这就用到了我们提到的Cookie、Session和Token这些东西了。其实Cookie、Session、Token就是一个身份标识,通过这个身份标识,来区分http请求。
Cookie、Session和Token这三者的工作原理、区别、优缺点推荐看我上面参考的那篇文章,写得很好,或者自行百度。
关于Token
jwt:jwt只是实现Token的一种方式,你也可以用其他的方式来实现Token。例如对称加密算法或自研的加密算法。
accessToken和refreshToken是为了解决token在实际使用中的一些问题。关于这二者可以参考:Access Token 与 Refresh Token或自行百度
accessToken:一个临时的token,有效时间很短,就是我们用来访问服务器资源所使用的那个token。
refreshToken:用来刷新accessToken的。当accessToken过期或者快要过期的时候,会用refreshToken向服务器获取一个新的accessToken。
为啥要用两个Token呢,这多麻烦啊。我在知乎上看到这个帖子jwt续签为什么要使用双token,没看明白啊,感觉单个token也可以啊?,或许可以解答这个疑惑。
以下是我自己的理解:
1)单独一个Token是可以的(也就是accessToken),token过期后,让用户在重新登录,在给他一个不就好了。这样的话,就需要把token的有效时间设置的长一点,不然用户老是频繁登录很影响使用体验。要避免频繁登录的话,就需要使用到refreshToken了。当accessToken过期后,使用refreshToken重新获取accessToken,将accessToken刷新,这样用户就不用登录了。所以refreshToken的有效时间大于accessToken的有效时间才行。
2)关于安全方面问题,双token这个东西是在OAuth2.0
标准中所用到的。*如果只是在用户(客户端)和服务端两者之间使用的话,它并没有安全防护的作用,或者说,它并不是为了解决token安全问题而被使用的,它是为了解决用户频繁登录而被使用的。*但如果是在OAuth2.0
标准中,它确实是为了解决安全问题而被使用的,但它不是解决token的安全问题,而是解决安全授权问题,例如我们常用的第三方登录。
关于OAuth
建议自行百度看看什么是OAuth标准,推荐:白话让你理解什么是oAuth2协议和非常详细!深入理解OAuth原理和实践细节两篇文章,写得很好。
画了个简单的图
这个授权流程在OAuth 2中被称为授权码模式(authorization code grant),其命名的原因是,应用程序使用授权码来向授权服务器申请访问令牌/刷新令牌。
有几点需要注意:
1)第三方授权服务器给的token令牌就是:accessToken和refreshToken
2)refreshToken可以获取新的accessToken,所以为了安全,refreshToken一般只在服务器之间使用安全的https进行传递。怎么个意思呢,就是应用APP那里其实是两个部分,一个是APP的客户端(前端),一个是APP的后端,它们之间的请求是APP前端-APP后端-授权服务器
,refreshToken自授权服务器传递到APP后端服务器上,就不往APP客户端传了,降低refreshToken被泄露的风险。
OAuth2.0
有四种模式,最主要的还是授权码模式,其它三种感觉只是变了变主体,还是同一个思路。理解授权码模式就可以了。
其实整个应用码授权模式还有很多知识没有详细说明,比如3.2中app的认证信息是什么,如何具体实现这个流程,有哪些条件等等,建议看看非常详细!深入理解OAuth原理和实践细节这篇文章,利用第三方github登录详细解释了整个过程,值得一看。我就是看这个明白的。
最后
以上内容比较粗糙,因为我只是记个大概就行,真要详细去学的话还是去看看RFC文档或者其他人的文章吧。
参考文章:
https://zhuanlan.zhihu.com/p/625995458
https://www.cnblogs.com/blowing00/p/4524132.html
https://www.zhihu.com/question/506320859/answer/2913603859
https://zhuanlan.zhihu.com/p/92051359