当前位置 > it书童 > 编程 > 正文
推荐小册
Java的Lambda表达式
Java的Lambda表达式

聊聊jvm
jvm调优

java异常处理
java异常处理机制

java拾遗
java知识点,java面试题

java多线程
java多线程入门

学习spring源码
如何阅读spring源码

仿 spring 自制框架
造轮子,模仿 spring 自制一个框架

SpringCloud
SpringCloud微服务入门

微服务商城
使用微服务搭建一个电商项目

SpringBoot
SpringBoot入门学习,SpringBoot是什么

什么是 JWT

编程 it书童 2020-09-27 10:40:59 0赞 0踩 87阅读 0评论

JWT 即 JSON Web Token, 是当下最流行的跨域认证解决方案

认证数据存储服务端存在的问题

传统的 web 网站是将认证数据写到服务器,流程如下:

  • 用户向服务器提交账号和密码

  • 服务器验证通过,在 session 中保存相关数据

  • 服务器返回一个 session_id,浏览器将其写入 cookie

  • 用户后续的请求都会带上 cookie

  • 服务器根据请求中 cookie 包含的 session_id 找到相应的 session, 从而识别到用户

这种方式如果用于单机的 web 网站是没问题的,流程也很简单

如果存在多台服务器,就需要将 session 数据共享,如:将 session 持久化写入数据库。这种方案存在单点故障的风险,如果数据库宕机了,所有认证服务都用不了

而且现在的客户端远不止 web 网站,还有移动端 App,微信公众号,小程序 等...

Session 方案无法满足不同客户端的需求

将认证数据交由客户端存储

既然服务端存在难以扩展的问题,就换另一种实现方式,由客户端携带完整的认证数据。每次发起请求,都向服务端说明自己的身份。服务端相当于是无状态的,不用再去考虑有多少客户端。就好比,刘亦菲不可能记住她所有粉丝的名字,但所有粉丝都记得她

JWT 就是将认证数据存储到客户端的一种解决方案,将认证数据封装成 Json 对象返回给客户端,在生成 json 对象时会加上签名,以后客户端携带此 json 对象发送到服务端,只要签名校验通过,即可根据 jwt 中的内容识别用户身份

JWT 的数据结构

jwt 最终的数据形式是一长串字符串,如:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbC5hcGkuaXRzaHV0b25nLmNvbSIsImlhdCI6MTYwMTA4MzMwNiwiZXhwIjoxNjMyNjE5MzA2LCJuYmYiOjE2MDEwODMzMDYsImp0aSI6Im5QTkV4MzhlbU01TWQ0V2wiLCJzdWIiOjEsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.mnU6nlLPHSx4Iinr1k__v7mEar2YaZL-OH365stmvLQ

这个字符串是由 . 分隔的三部分组成的,依次为:

  • Header 头部

  • Payload 负载

  • Signature 签名

Header

描述 JWT 的元数据

如:

{
  "alg": "HS256",
  "typ": "JWT"
}

alg 表示签名的算法,type 表示令牌的类型

Payload

存放实际需要传递的数据,以下是 JWT 规定的 7 个官方字段:

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

此外,我们可以定义私有字段,如:

{
  "sub": "123",
  "name": "程心",
  "skill": "圣母的眼泪",
}

Payload 与 Header 的 json 对象都会经由 Base64URL 算法转为字符串

Signature

对前两部分数据的签名,防止数据被篡改

签名匹配的流程:

  • 服务端指定一个密钥,不可泄露给用户

  • 使用 JWT Header 指定的签名算法生成签名

签名生成后,再将 Header Payload Signature 拼接成用 . 分隔的字符串,然后返回给用户

小结

客户端可以将 JWT 写入 Cookie,但这样不能跨域,也可以通过 post 方式提交,但 post 一般用于提交业务数据。一般是将 JWT 存放在 HTTP 请求的头信息 Authorization 字段中

如:

Authorzation: Bearer <token>

参考

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/714/what-is-jwt