JSON Web Tokens (JWT) 是一种开放的行业标准 RFC 7519 方法,用于在两方之间安全地表示声明。
让我们进一步解释一些概念。
- 紧凑性
由于其较小的尺寸,JWT 可以通过 URL、POST 参数或 HTTP 标头发送。此外,较小的尺寸意味着传输速度很快。
- 自包含性
有效载荷包含关于用户的所有必要信息,避免了多次查询数据库的需要。
2018年3月25日大约 8 分钟
JSON Web Tokens (JWT) 是一种开放的行业标准 RFC 7519 方法,用于在两方之间安全地表示声明。
让我们进一步解释一些概念。
由于其较小的尺寸,JWT 可以通过 URL、POST 参数或 HTTP 标头发送。此外,较小的尺寸意味着传输速度很快。
有效载荷包含关于用户的所有必要信息,避免了多次查询数据库的需要。
相比于 Session 认证的方式来说,使用 token 进行身份认证主要有下面三个优势:
token 自身包含了身份验证所需要的所有信息,使得我们的服务器不需要存储 Session 信息,这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。
但是,也正是由于 token 的无状态,也导致了它最大的缺点:
当后端在token 有效期内废弃一个 token 或者更改它的权限的话,不会立即生效,一般需要等到有效期过后才可以。
另外,当用户 Logout 的话,token 也还有效。除非,我们在后端增加额外的处理逻辑。
在分布式系统中,session 共享是一个必须要解决的问题。
JWT 作为将信息放在客户端的解决方案,设计的非常巧妙,本节就让老马和大家一起学习下 JWT 的使用。
或者说为什么使用 jwt?
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。
互联网服务离不开用户认证。
一般流程是下面这样。
1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id,写入用户的 Cookie。
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
一般为 jwt 的生成和验证。
//签发时间
String jwtSalt = "$123456$";
Date issuanceTime = new Date();
// 生成过期时间,可以动态指定。一般为 1H。
Date expireTime = getExpireDate();
Map map = new HashMap<>();
map.put("alg", "HS256");
map.put("typ", "JWT");
//额外信息
String operatorId = resp.getOperatorId();
String token = JWT.create()
.withHeader(map)
.withClaim(JwtConst.OPERATOR_ID_KEY, operatorId)
.withIssuedAt(issuanceTime)
.withExpiresAt(expireTime)
.sign(Algorithm.HMAC256(jwtSalt));