JWT
Posted gootter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JWT相关的知识,希望对你有一定的参考价值。
JWT 的原理
服务器认证后,发送一个JSON对象给用户。之后用户与服务器通信的时候,都要发回这个JSON对象。同时,为了防止用户篡改数据,服务器生成这个数据的时候,会加上签名。
JWT 的数据结构
它是一个很长的字符串,中间用点(.
)分隔成三个部分。
三个部分一次如下:
- Header(头部)
- Payload(负载)
- Signature(签名)
Header
JSON对象,描述 JWT 的元数据
{ "alg": "HS256", "typ": "JWT" }
alg表示签名的算法,默认是 HMAC SHA256(写成 HS256)
typ表示令牌的token类型,JWT令牌统一写为JWT
最后使用Base64URL 算法将他转换成字符串
Payload
JSON对象,用来存放实际需要传递的数据。
7个官方字段:
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
也可以定义私有字段,但不能存放私密字段
最后使用Base64URL 算法将他转换成字符串
Signature
对前两部分的签名,防止数据篡改
首先,指定一个只有服务器才知道的密钥secret,之后使用header中的签名算法使用如下方式产生签名,默认(HMAC SHA256)
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
最后将以上三部分字符串拼接,拼接处用.分隔
Base64URL
类似于Base64,但是有些小的不同。
JWT令牌可能会放在URL中,Base64 有三个字符+
、/
和=
,在 URL 里面有特殊含义,所以要被替换掉:=
被省略、+
替换成-
,/
替换成_
。这就是 Base64URL 算法。
JWT 的使用方式
(1)放在客户端的cookie或localStroage中,放在cookie中每次请求都会自动发送,但是不能跨域
(2)放在请求头信息Authorization
字段里面
(3)放在post请求体中
JWT 的几个特点
(1)JWT默认时不加密的,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。不加密的情况下,不能将秘密数据写入JWT
(2)JWT不仅可以用于认证,也可以用于交换信息
(3)为减少盗用,JWT不应该用HTTP明码传输,而使用HTTPS,对于比较重要的权限,应该进行二次验证
(4)JWT的缺点,由于保存在客户端,因此服务端在token到期之前是不可控的,尽量减短token的过期时间
以上是关于JWT的主要内容,如果未能解决你的问题,请参考以下文章
OkHttpInterceptor 从 kotlin 拦截器导航到登录片段
AttributeError: ‘str‘ object has no attribute ‘decode‘解决方法
《代码实例》jwt参与用户凭证方式,生成jwt,security整合jwt
我已经在 Spring Boot 代码中实现了 JWT 令牌安全性。如何在我的代码中的任何地方获取 jwt 令牌?需要保存审核