token、cookie和前后台分离时的认证问题

2022-11-19

# 前后端分离的token问题

 

token:jwt,Json Web Token,一个被被签名后的字符串,被修改后能被发现的字符串!下称token均指该字符串。

token是自包含(负载中已经包含了用户信息或其他信息)、被签名的。任何人对token的修改会使之失效(服务器根据负载中信息,去验证签名是否正确,所以负载被修改或签名被修改都会导致失效)。

 

# Cookie

古早时期,网页就是一个 URL,只是一个地址,任何人都可以访问。

/a

/b

如果想 特定URI如 /b 只能某些人(如张三)访问呢?只能通过这种方式(暂不考虑ip认证等其他方式):给张三一个用户名和密码,访问时先去登录页面登录,把用户名、密码提交给Server,Server判断用户名和密码正确,然后在这个请求过程中返回某种类似通行证的东西给Browser,Browser把这个通行证保存,下次访问这个网页(Server)时带上这个通行证Server就能确定访问用户了。
 

上面的通行证就是Cookie。

 

所以Http协议制定了Cookie机制,浏览器和服务器中的Http协议实现者也都完全支持了cookie。
 

cookie由服务器签发,交给浏览器保存、维护(到期后不再随HTTP请求提交)。

 

服务器需要确定cookie是否有效。方式有

1. 随机产生一段字符串,服务器保存一份(有人称保存该字符串的容器为Session),浏览器提交过来时,查找服务器(Session中)是否有保存

2. cookie值放token字符串。

 

# 可以不用cookie

网页越来越复杂,比如跨域访问某些资源、前后台分离开发或部署时也会跨域,因为token大多被存放在localStorage里,所以请求发出方可以很轻松的获取、存放、发送请求时带上该token。

所以,当静态资源全部开放并且这些静态资源不需要使用cookie鉴权时,或者没有网页,只有客户端来调用API时,可以完全抛弃cookie。

所有认证信息在使用axios、fetch时手动指定认证信息(token)。

 

# 何时离不开cookie

静态页面需要认证,

静态页面需要确认请求来源,需要根据来源确定用户时,就必须使用cookie,因为cookie是浏览器自动带到所有请求上的。

 

# token有效期和重签发

token存在有效期,在构造token时即确定并写死,无法更改。

 

## 过期

cookie中过期,浏览器直接把本地的cookie删了。

localStorage中过期?

1 负载中带有有效期,发出请求时检查 或者,

2 token中未携带有效期时,直接发给Server,过期时响应特定状态码(如401),再清除
 

## 重签发

Server拿到请求,发现token将要过期 --11. 新的token写到cookie中,并且cookie有效期和新token保持一致。

2. 若不使用cookie,指定响应码,axios收到该响应码时更新token,新token在当前响应体中带过来。或者调用个新的接口来响应新的token,再更新localStorage中的token。


## 废弃token

token一经签发,在指定的有效期内都是一段"有效的"字符串,服务端没办法直接判断该token是否以废弃。

可以这样,把要废弃的token保存在redis、mysql,Map等容器中,生命设置到token原生命周期。当请求过来时先查一下带来的token有没有被废弃,再决定响应码。
 

# 前台(浏览器)和客户端

使用Cookie时,有效期由Server指定,Browser只能主动调用注销接口让Server来设置Cookie的有效期为0使之失效。http响应回到浏览器时,浏览器更新cookie有效期,失效。

Token存在localStorage中时,前台主动废弃可以直接删掉token。