开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
前言
以往在用户登录认证中,经常使用 cookie +session 的方式完成用户信息的存储。就是在用户登录成功后服务端就保存 session ,然后返回给客户端一个 sessionId ,客户端再将sessionId 存储在cookie 中。但是这种方式在用户量增多时就会造成服务器开销大,且不是很安全。后来提出一种新的方式 token认证,token 是由JWT 生成的。
JWT
JWT是一种开放标准(RFC 7519),它定义了一种简洁的、自包含的方式,用于将各方之间的信息安全地传输为JSON对象。
用处:
- 认证 : 最常用的使用方式;用户在登录的时候进行认证,通过后将授权信息保存到JWT中,之后每次请求都携带JWT进行访问;
- 信息交换: JWT中包含信息的签名,因此可以用于安全地信息传递;
数据结构 - Header 保存配置信息 (typ:type token类型,alg:algorithm 签名算法)
- Payload 保存认证信息{}
- Signature 前两者信息的签名
整个token生成(三个部分 )
【header(Base64编码)】 . 【Payload(Base64编码)】 . 【【header(Base64编码)】 . 【Payload(Base64编码)】(header中alg签名算法)】
使用场景
客户端接收服务端返回的 JWT ,然后将其存储在 Cookie 中。之后每次客户端与服务端通信时都带上 JWT。比较合适的用法就是将其放在 HTTP 请求的头信息 Authorization 字段里面。
优劣势
优点:
- jwt 可用于认证,也可以用于交换信息。
- 可扩展性好。在分布式场景中如果使用session的话就需要多机器共享 session ,使用时需要将其存储在数据库中或 redis 中进行共享,而使用 JWT 就不需要。
- JWT 也不存储任何服务端的状态。在 jwt 的payload 中可以存储一些常用信息用于交换信息。
缺点:
- 安全性:jwt 的payload 是无加密的不能存储敏感数据
- 一次性:jwt 都是一次性的如果修改了其中的内容就需要重新生成。