理解 JWT (json web token)
huruji opened this issue · 0 comments
JWT 是 Json Web Token 的缩写,是一种轻量级的用户与服务器信息传递规范,相应规范的标准可以在 RFC 7519 查看,你也可以在网站 jwt.io上看到更详细的介绍。
jwt 本质上是一个加密过的字符串,由header(头部)、payload(载荷)、signature(签名)三部分组成,并通过符号 .
对这三部分进行拼接,一个jwt类似于 xxxxx.yyyyy.zzzzz
Header
Header 部分描述了相应的 JWT 的类型和相应的签名算法,如下:
{
"alg": "HS256",
"typ": "JWT"
}
payload
{ "iss": "Online JWT Builder",
"iat": 1416797419,
"exp": 1448333419,
"aud": "www.example.com",
"sub": "jrocket@example.com",
"GivenName": "Johnny",
"Surname": "Rocket",
"Email": "jrocket@example.com",
"Role": [ "Manager", "Project Administrator" ]
}
iss: 该JWT的签发者,是否使用是可选的;
sub: 该JWT所面向的用户,是否使用是可选的;
aud: 接收该JWT的一方,是否使用是可选的;
exp(expires): 什么时候过期,这里是一个Unix时间戳,是否使用是可选的;
iat(issued at): 在什么时候签发的(UNIX时间),是否使用是可选的;
其他还有:
nbf (Not Before):如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟;,是否使用是可选的;
对上面的信息进行base编码得到了对应的字符串
signature
对于 header 和 payload 中的得到的字符串进行拼接后,使用加密算法加密,加密的时候需要提供相应的 密钥(secre),加密后得到的字符串拼接后就得到了完整的 JWT
存储 JWT
token的存储是客户端控制的,客户端可以选择存储在 localstorage 或者 cookie 中,为了安全,可以存储在 cookie 中,并设置 httponly
前端如何在请求的时候发送 token
token可以通过 cookie,header,post的body发送,关键是需要前后端上商量好,比较方便实现的就是 header 和 cookie,post的body发送应该尽量在 https 在实现,这样保证安全性
JWT如何防止被别人获取
返回 JWT 时记录用户的 ip
JWT的优点
可防护 CSRF 攻击
不在服务端保存会话消息,减轻了服务器负担,易于拓展
方便跨域
对于无法使用 cookie 的场景,仍然有效
JWT 注销问题
因为服务端没有存储会话信息,所以注销无法像 session 一样,直接在服务端清除即可,可以在 redis 层做一个标记,标记相应的 token 已经失效
参考: