[ 后端与jwt认证 | 青训营笔记]

106 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

JWT身份认证(Json Web Token)

1 cookie、session、Token的区别

Cookie

cookie 是⼀个⾮常具体的东⻄,指的就是浏览器⾥⾯能永久存储的⼀种数据,仅仅是浏览器实现的⼀种数据存储功能。cookie由服务器⽣成,发送给浏览器 ,浏览器把cookie以key-value形式保存到某个⽬录下的⽂本⽂件内,下⼀次请求同⼀⽹站时会把该cookie发送给服务器。

Session

Session字⾯意思是会话,主要⽤来标识⾃⼰的身份。

⽐如在⽆状态的api服务在多次请求数据库时,如何 知道是同⼀个⽤户,这个就可以通过session的机制,服务器要知道当前发请求给⾃⼰的是谁,为了区分客户端请求, 服务端会给具体的客户端⽣成身份标识session ,然后客户端每次向服务器发请求 的时候,都带上这个“身份标识”,服务器就知道这个请求来⾃于谁了。

⾄于客户端如何保存该标识,可以有很多⽅式,对于浏览器⽽⾔,⼀般都是使⽤ cookie 的⽅式 ,服务器使⽤session把⽤户信息临时保存了服务器上,⽤户离开⽹站就会销毁,这种凭证存储⽅式相对于 ,cookie来说更加安全。

Token

token的意思是“令牌”,是⽤户身份的验证⽅式,最简单的token组成: uid(⽤户唯⼀标识) + time(当前 时间戳) + sign(签名,由token的前⼏位+盐以哈希算法压缩成⼀定⻓度的⼗六进制字符串) ,同时还可 以将不变的参数也放进token。这里说的token指的是 JWT(Json Web Token)

2 JWT是个啥?

⼀般⽽⾔,⽤户注册登陆后会⽣成⼀个jwt token返回给浏览器,浏览器向服务端请求数据时携带 token ,服务器端使⽤ signature 中定义的⽅式进⾏解码,进⽽对token进⾏解析和验证。

image.png

  • header: ⽤来指定使⽤的算法(HMAC SHA256 RSA)和token类型(如JWT)
  • payload: 通常是⽤户信息或其他数据的声明,⽐如⽤户id,名称,邮箱等。
  • signature: ⽤来保证JWT的真实性,可以⽤不同的算法

啥时候使用JWT呢?

我们要明白的时候,JWT是用作认证的,而不是用来做授权的。明白他的功能,那么对应JWT的应用场景就不言而喻了

image.png

WT认证过程基本上整个过程分为两个阶段

  • 第⼀个阶段,客户端向服务端获取token
  • 第⼆阶段,客户端带着该token去请求相关的资源

通常⽐较重要的是,服务端如何根据指定的规则进⾏token的⽣成。

在认证的时候,当⽤户⽤他们的凭证成功登录以后,⼀个JSON Web Token将会被返回。 此后,token就是⽤户凭证了,你必须⾮常⼩⼼以防⽌出现安全问题。 ⼀般⽽⾔,你保存令牌的时间不应该超过你所需要它的时间。

⽆论何时⽤户想要访问受保护的路由或者资源的时候,⽤户代理(通常是浏览器)都应该带上JWT,典型 的,通常放在Authorization header中,⽤Bearer schema: Authorization: Bearer 服务器上的受保护的路由将会检查Authorization header中的JWT是否有效,如果有效,则⽤户可以访问 受保护的资源。

如果JWT包含⾜够多的必需的数据,那么就可以减少对某些操作的数据库查询的需要,尽管可能并不总是如此。 如果token是在授权头(Authorization header)中发送的,那么跨源资源共享(CORS)将不会成为问题,因为它不使⽤cookie。