目录
引言
在用户和服务器之间建立认证状态是Web开发中常见的需求。Session
和JWT
(JSON Web Token)是两种常用的机制,但它们在工作原理、存储方式和安全性等方面存在差异。
什么是JWT?
JWT
是一种开放标准(RFC 7519),用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。JWT
由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
- 头部(Header):包含了关于生成该
JWT
的信息以及所使用的算法类型。 - 载荷(Payload):包含了要传递的数据,例如身份信息和其他附属数据。
JWT
官方规定了7个字段,可供使用:iss
(Issuer):签发者。sub
(Subject):主题。aud
(Audience):接收者。exp
(Expiration time):过期时间。nbf
(Not Before):生效时间。iat
(Issued At):签发时间。jti
(JWT ID):编号。
- 签名(Signature):使用密钥对头部和载荷进行签名,以验证其完整性。
JWT优点分析
相较于传统的基于会话(Session)的认证机制,JWT
具有以下优势:
- 无需服务器存储状态:服务器无需存储任何会话状态信息,所有的认证和授权信息都包含在
JWT
中。 - 跨域支持:
JWT
可以轻松地在多个域之间进行传递和使用,实现跨域授权。 - 适应微服务架构:在微服务架构中,很多服务是独立部署并且可以横向扩展的,这就需要保证认证和授权的无状态性。
- 自包含:
JWT
包含了认证和授权信息,以及其他自定义的声明,这些信息都被编码在JWT
中。 - 扩展性:
JWT
可以被扩展和定制,可以按照需求添加自定义的声明和数据。
JWT基本使用
在Java开发中,可以借助JWT
工具类来方便的操作JWT
,例如HuTool框架中的JWTUtil
。
3.1 添加HuTool框架依赖
在pom.xml
中添加以下依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
3.2 生成Token
Map<String, Object> map = new HashMap<String, Object>() {
private static final long serialVersionUID = 1L;
{
put("uid", Integer.parseInt("123")); // 用户ID
put("expire_time", System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 15); // 过