一、JWT简介
1.1 概述
JWT,又称为JSON Web Token,是通过JSON形式作为Web应用的令牌,用于各方之间安全地将信息作为JSON对象传输,在数据传输时能够完成数据加密、签名等相关处理。
1.2 好处
在JavaWeb阶段,经常使用session来存储,以方便用来判断用户是否操作等。但这又恰巧暴露了一个问题,用session存储是需占用服务器内存的。当用户只有一两个的时候没什么问题,但是当用户成千上万时,服务器就很难招架得住了。并且session是基于cookie来实现的,因此数据很容易被截获,遭遇CSRF跨域伪造攻击,因此不太安全。这时JWT的优势就突出显示出来的。
- 简洁(compact):可以通过URL,POST参数或者HTTP header发送,因为数据量小,传输数据也很快;
- 自包含(self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库;
- 因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任意web形式都支持;
- 不需要在服务端保存会话信息,特别适用于分布式微服务;
二、结构组成
JWT中的token组成主要分成三部分:
- 标头(Header)
- 有效载荷(Payload)
- 签名(Signature)
2.1 标头(Header)
标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如:HMAC、SHA256、RSA。它会使用Base64编码组成JWT结构的第一部分。值得一提的是,Base64是一种编码方式,并不是一种加密算法。换言之,它可以被翻译回原来的样子。
{
"alg":"HS256",
"typ":"JWT"
}