什么是Json Web Token
前言
Jwt
全称Json Web Token
, 是一种防篡改的数据格式, 可以明文, 可以加密. 我们可以用来存储简单的鉴权信息在Jwt
之中.
现在主流的应用场景有单点登录, 替代Session
, 一次性鉴权.
但是我发现了这篇文章Stop using JWT for sessions, 作者说不要用Jwt
来进行身份认证.
建议看完本文后, 再深入阅读这篇文章.
Jwt
只是一种数据格式, 就像JSON
一样!Jwt
只是一种数据格式, 就像JSON
一样!Jwt
只是一种数据格式, 就像JSON
一样!
重要的话说3
遍, 好了往下看.
结构组成
1 | eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.gG3FV1r3HgYYUd04sTUh2asQbk68SjmkivuaBHCRhLo |
上面是一个JWT
, 分为3
个部分, header
和claims
都是用base64
编码, 3
个部分用.
连接起来.
header
: 头部, 最少包含了签名算法.claims
: 内容, 包含了你想要放进去的数据.signature
: 签名
用base64
解码header
和claims
可得
1 | eyJhbGciOiJIUzI1NiJ9 ----> {"alg":"HS256"} |
后面的gG3FV1r3HgYYUd04sTUh2asQbk68SjmkivuaBHCRhLo
是签名, 是不可读的, 签名算法就是header
的alg
字段的值HS256
.
可以在Debugger
工具测试.
Q1
: 为什么说Jwt
是防篡改的?A1
: 我们不知道签名的私钥, 不信你在Debugger
工具试试, 用上面的header
和claims
, 在不知道私钥的情况下, 你能得到gG3FV1r3HgYYUd04sTUh2asQbk68SjmkivuaBHCRhLo
吗? 我就告诉你私钥是123456
了, 你猜的到吗?
Q2
: Jwt
能用来替换Session
吗?A2
: 它们应该是组合使用, 而不是对立的. Stop using JWT for sessions
Q3
: 那我到底要在什么地方用Jwt
?A3
: 一般移动端用的比较多, 移动端不像浏览器有一套透明的Cookie
方案.
JJWT 应用
我们先来看一个例子
1 | public class JwtTest { |
JwtBuilder
使用Builder
模式, 构建header
和claims
, 最后再调用signWith
方法添加signature
签名.
之后我们使用Jwts.parser()
来解析token
, 在parseClaimsJws(token)
会抛出一堆RuntimeException
, 用来校验token
是否有效.
得到的Claims
其实就是一个Map
, 我们从中获取需要的数据即可.
整合 Spring Boot
查看我在Github
上的一个示例工程.
https://github.com/Ahaochan/project/tree/master/ahao-spring-boot-jwt