关于JWT

在写博客项目的时候接触到一个jwt的node包,就了解了一下概念。
1. 什么是jwt

JWT(Json Web Token)是一个允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

JWT就是一个字符串,由头部(header),载荷(payload)与签名(signature)组成。

2. 是怎么生成的

头部(Header)
用于描述关于该JWT的最基本信息。如其类型和签名所用的算法。

1
2
3
4
{
"type": "JWT",
"alg": "HS256" // 常用算法
}

对该JSON对象进行Base64编码,就成了JWT的头部

载荷(Payload)
用于描述操作的信息,帮助服务器理解这个JWT

1
2
3
4
5
6
7
8
9
{
"iss": "John Wu JWT", // 该JWT的签发者
"iat": 1441593502, // 在什么时候签发的
"exp": 1441594722, // 什么时候过期,这里是一个Unix时间戳
"aud": "www.example.com", // 接收该JWT的一方
"sub": "jrocket@example.com", // 该JWT所面向的用户
"from_user": "B",
"target_user": "A"
}

可以在标准中找到字段
将改JSON对象进行base64编码,得到的字符串称为payload

签名(signature)
将头部和载荷的字符串用.链接在一起,然后将拼接完的字符串用HS256(之前描述的)算法进行加密,加密时还需要一个密钥(secret),比如为luck(保存在服务器端),就可以得到加密的结果,即签名

服务器在接收到JWT后,会先对头部和载荷的内容用同一算法再次签名,若token不同则说明被动过(比如载荷被修改,加密的结果就不同)

请求会被拦截,jwt的信息容易破解(base64解码)容易暴露,故不能用来传输敏感信息。

常用于设计用户认证和授权系统,下订单等。

3.和session有什么区别

  1. token是存客户端的,每次加在请求的头部发给服务器。不适合负载的接口校验?
  2. session是存在服务端的

JSON Web Token - 在Web应用间安全地传递信息