一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
token
谈到token,我们就不得不提一个问题:什么是cookie·?什么是session·?什么是token·?
- cookie是一个字符串,用户每次发送请求的时候,浏览器会自动携带cookie发送给服务器。cookie储存在浏览器中。cookie一般用来记录用户的登录状态。用cookie也可能会遇到一些小问题,就是一旦cookie被劫持的话,就可以顶替用户的身份了。
- session 是一个在服务端记录回话信息的方式,每次用户登陆后,服务端就会建立一个session然后返回sessionID给客户端,一般这个sessionID是储存在cookie中的,然后每次用户访问时候都携带这个sessionId,服务端就可以识别用户的身份了🆔。可是这样会有一些问题,就是如果只有一个服务器还好,如果是分布式服务器的话,session同步是个问题,需要其他服务器复制session内容,比较不方便,而且一旦访问数量较大,服务器的内存资源消耗是十分大的,或者就是专门有个服务器来做状态管理。
- 为了解决session存储在服务端内存消耗和session数据同步的问题,jwt的方式就出现了。服务端只用负责将信息加密,然后将加密后的信息发送给客户端,这个东西叫做token,然后客户端每次访问服务端时候携带这个token,服务端读取token然后解密,读取用户的状态信息。这样就解决了 服务端存储 用户状态的信息的问题。大大减少了 服务端的压力,但是token使用过程中也需要注意一些东西,token一旦签发服务端 如果想取消这个token就比较麻烦了,大多数时间我们都尽量把token的时间设置的尽量短一点儿。如果需要,我们可以flush_token来延长这个token的时间。
token的数据结构
一个token有三部分组成
- Header(头部)
- Payload(负载)
- Signature(签名)
header:1. 加密方式 2. 类型
payload : 1. 负载内容 2. token生命时长 3. 签发者·····
verify signature: 1. 对header的摘要,防止数据被修改 2. 对payload的摘要
基于token的认证机制将认证信息返回给客户端并存储。下次访问其他页面,需要从客户端传递认证信息回服务端。
简单的流程如下:
- 客户端使用用户名跟密码请求登录;服务端收到请求,去验证用户名与密码;
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据;
基于token的优点:
- 支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的;
- 无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而session需要在服务端存储,一般是通过cookie中的sessionID在服务端查找对应的session;
- 无需绑定到一个特殊的身份验证方案(传统的用户名密码登陆),只需要生成的token是符合我们预期设定的即可;
- 更适用于移动端(Android,iOS,小程序等等),像这种原生平台不支持cookie,比如说微信小程序,每一次请求都是一次会话,当然我们可以每次去手动为他添加cookie,详情请查看博主另一篇博客;
- 避免CSRF跨站伪造攻击,还是因为不依赖cookie;