huruji/blog

理解 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 已经失效

参考:

jwt.io

基于Token的WEB后台认证机制

Web 安全之 XSS、CSRF 和 JWT

JWT介绍和优缺点及适用场景分析

JWT 如何被恶意劫持了怎么办?会出现这种情况吗?