理解 JWT(Json Web Token)
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 已经失效
参考
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论