简介
JWT
http
协议无状态的,所以需要
sessionId
或
token
的鉴权机制,
jwt
的
token
认证机制不需要在服务端再保留用户的认证信息或会话信息。这就意味着基于jwt
认证机制的应用程序不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,jwt
更适用于分布式应用
1
、前端通过
Web
表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个
POST
请求。建议的方式是通过SSL
加密的传输
(HTTPS)
,从而避免敏感信息被嗅探
2
、后端核对用户名和密码成功后,将包含用户信息的数据作为
JWT
的
Payload
,将其与
JWT Header
分别进行Base64
编码拼接后签名,形成一个
JWT Token
,形成的
JWT Token
就是一个如同
lll.zzz.xxx
的字符串
3
、后端将
JWT Token
字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token
即可
4
、前端在每次请求时将
JWT Token
放入
HTTP
请求头中的
Authorization
属性中
(
解决
XSS
和
XSRF
问题
)
5
、后端检查前端传过来的
JWT Token
,验证其有效性,比如检查签名是否正确、是否过期、
token
的接收方是否是自己等
6
、验证通过后,后端解析出
JWT Token
中包含的用户信息,进行其他逻辑操作
(
一般是根据用户信息得到权限等)
,返回结果
JWT
的优势
1
、简洁:
JWT Token
数据量小,传输速度也很快
2
、因为
JWT Token
是以
JSON
加密形式保存在客户端的,所以
JWT
是跨语言的,原则上任何
web
形式都支持
3
、不需要在服务端保存会话信息,也就是说不依赖于
cookie
和
session
,所以没有了传统
session
认证的弊端,特别适用于分布式微服务
4
、单点登录友好:使用
Session
进行身份认证的话,由于
cookie
无法跨域,难以实现单点登录。但是,使用token
进行认证的话,
token
可以被保存在客户端的任意位置的内存中,不一定是
cookie
,所以不依赖cookie
,不会存在这些问题
5
、适合移动端应用:使用
Session
进行身份认证的话,需要保存一份信息在服务器端,而且这种方式会依赖到Cookie
(需要
Cookie
保存
SessionId
),所以不适合移动端
jwt
的组成部分
标准的
jwt
令牌分为三部分,分别是
Header
、
payload
、
signature
;在
token
字符串中使用
.
进行分割
Header
的组成部分包括两点:参数类型
jwt
,签名的算法
hs256
Payload
的组成就是登陆用户的一些信息,和
token
发行和失效时间等;这些内容里面有一些是标
准字段,你也可以添加其它需要的内容
Signature
是先用
Base64
编码的
header
和
payload
,再用加密算法加密一下,加密的时候要放进去
一个
Secret
,这个相当于是一个密码,这个密码秘密地存储在服务端
JWT
每部分的作用,在服务端接收到客户端发送过来的
JWT token
之后:
header
和
payload
可以直接利用
base64
解码出原文,从
header
中获取哈希签名的算法,从
payload
中获取有效数据。
signature
由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验
token
有没有被篡改。
服务端获取
header
中的加密算法之后,利用该算法加上
secretKey
对
header
、
payload
进行加密,
比对加密后的数据和客户端发送过来的是否一致。注意
secretKey
只能保存在服务端,而且对于不
同的加密算法其含义有所不同,一般对于
MD5
类型的摘要加密算法,
secretKey
实际上代表的是盐
值
JWT
工作原理