原文链接:https://kixuan.github.io/posts/f568/
我一直对JWT 有一些了解,但由于我要为这个项目撰写有关JWT 登录的文章,因此我将总结一下我对JWT 的了解以及我在在线面试中考虑的要点。
参考:
Cookies、Sessions、Tokens、JWTs——通俗地说,确认并证明当前用户的身份- CSDN博客
JSON Web Token 入门教程- 阮一峰的博客
https://cloud.tencent.com/developer/article/2231547
JWT详解(保姆级教程) – 阿里云开发者社区
使用JWT双token(双token)实现登录认证_双token的3种认证- CSDN博客
零、前置知识
cookie、session、token的区别
Cookies:用于在客户端存储会话信息,后续每次请求时,Cookies都会通过HTTP headers发送到服务器==>对于敏感信息不安全(跨站脚本、跨站请求格式化Jeri)
Session:Session存储在服务器端,Session ID存储在客户端的cookie中。向服务器请求时只发送会话ID==>如果出现用户数。特别是如果它很大,服务器可以轻松分配它。
令牌:可以存储在客户端或服务器端,具体取决于实现。常见的方法是将令牌存储在客户端(localStorage、sessionStorage、浏览器内存等)。 ///无状态///高度可扩展,可以包含任何信息
Cookie 和 Session 的区别
安全性:会话cookie存储在客户端,而会话存储在服务器端。访问值的类型不同。 Cookie 仅支持存储字符串数据。如果要设置其他类型的数据,必须将会话转换为所需的数据类型。不同的生命周期:例如,您经常使用的默认登录功能的会话生命周期很短,在客户端关闭时(默认情况下)过期。会话超时。不同的存储大小:单个cookie 不能存储超过4K 的数据。但是,会话可以比cookie 存储更多的数据。但过多的访问会过度占用服务器资源。
为什么session比cookie安全?
不可篡改:Cookie存储在客户端,可以在客户端修改。相反,会话数据通常存储在服务器端,攻击者无法直接修改。
盗窃难易程度:同上。
持久性:这意味着即使您关闭浏览器,这些cookie 也会存储在您的设备上。长期存在可能会增加攻击者窃取cookie的机会
Token 和 Session 的区别
会话是一种记录服务器和客户端之间会话状态的机制,使服务器具有状态并允许其记录会话信息。令牌是访问资源接口(API) 所需的资源凭证,它使服务器无状态且不存储会话信息。
一、出现背景
为了维护用户会话状态,传统的Web开发通常使用基于cookie和基于会话的方法来存储相关数据,例如用户的角色和登录时间。但也存在一些问题,例如跨域资源共享(CORS)和无状态服务。
对于服务器集群,或者需要CORS架构,会话数据库必须是共享的。
解决了:
会话数据持久化——写入数据库或其他持久层,这需要大量的工作。它不是很稳定,如果持久层挂了,那就是单点故障,服务器将无法保存。会话数据存储在客户端上并随每个请求一起发送。
JSON Web Token(简称JWT)代表两种方案,是目前最流行的跨域认证方案。
基于会话的身份验证过程基于JWT 的身份验证过程当用户在浏览器中输入用户名和密码时,服务器在通过密码验证后生成一个会话并将其存储在数据库中。同时,服务器会在cookie中记录该会话ID属于哪个域名,后续对该域名的请求会联系服务器以检索该cookie。 cookie中的sessionId用于查找数据库,当用户在浏览器中输入用户名和密码时,会生成一个令牌并将其存储在数据库中。前端检索令牌并将其存储在cookie 或本地存储中。此令牌信息包含在后续请求中,这些请求联系服务器以检索令牌值,然后搜索数据库以确定当前令牌是否有效。
二、原理
组成部分
JWT 原理基于三部分:标头、负载和签名。它们用点(.) 连接起来形成一个紧凑的字符串,可以通过URL、POST 参数或HTTP 标头发送。
标头:包含两条信息:令牌的类型(JWT)和使用的签名算法(例如HMAC SHA256 或RSA)。有效负载:存储声明或有关实体(通常是用户)的信息和其他数据。有效负载包含一些预定义的标准语句(例如,发行者、主题、受众),也可以包含自定义语句。签名:用于验证消息完整性的签名部分。它是通过对编码的标头、有效负载和秘密(例如使用HMAC 算法时的密钥)进行签名而生成的。
运行流程
header 部分是一个JSON 对象,描述JWT 的元数据,并使用Base64URL 算法转换为字符串。
{
\’alg\’: \’HS256\’, //签名算法
\’typ\’: \’JWT\’ //令牌类型
}
Payload: 经过服务器认证后,会生成一个JSON 对象来存储需要发送的实际数据,并使用Base64URL 算法转换为字符串。
//JWT提供了7个官方字段供选择,也可以定义私有字段
– ISS(发行人):发行人
– exp(到期日期):到期日期
– sub(主题):主题
– aud(观众):观众
– nbf(Not Before):有效期
– iat(发行时间):发行时间
– jti(JWT ID):数字
{
\’姓名\’:\’张三\’,
\’角色\’: \’管理员\’,
“到期日期”:“2018 年7 月1 日0:00”
}
Signature: 是通过使用秘密(例如,使用HMAC 算法时的密钥)对Base64 编码的标头和负载进行签名而生成的。 指定一个只有服务器知道的密钥,并使用标头中指定的签名算法alg 计算签名。客户端接收服务器返回的JWT。 JWT 可以存储在cookie 或localStorage 中。此后客户端每次与服务器通信时都必须检索这个JWT(也可以将这个JWT放在HTTP请求头信息的Authorization字段中,以方便跨域)
三、代码实现
参考:使用JWT双token(双token)实现登录认证_双token的3种认证- CSDN博客
双令牌:无意义的登录更新
access_token有可能泄露
由于Refresh_token泄漏的几率相对较小,并且仅在每次access_token过期时使用,因此两者的结合保证了良好的用户体验,同时最大限度地避免了令牌泄漏带来的安全风险。
userService登录方法
将刷新令牌存储在数据库访问令牌中并将其返回到前端。刷新accessToken:当短期token过期后,前端必须通过长期token访问后端,生成短期token。获取持续时间令牌并将其返回到前端。即刷新临时令牌。
删除refreshToken:用户使用完毕后,必须删除数据库中的freshToken。
四、相关面试题(来源牛客)
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93815.html