一、JWT是什么
JWT的全称为json web token。是一种生成token的方式。一般我们访问一个系统的流程就是:请求登录接口,该接口会返回一个token,为了防止对象数据被篡改,生成JSON时会加上签名,请求其他接口都要带上token,token验证通过才能访问成功,而JWT就是生成token的一种机制。广义上讲JWT是一个标准的名称;狭义上讲JWT指的就是用来传递的那个token字符串。
二、JWT的组成
JWT含有三个部分:

  • 头部(header)
  • 载荷(payload)
  • 签证(signature)

2.1 头部(header)
头部一般有两部分信息:类型、加密的算法(通常使用HMAC SHA256)
头部一般使用base64加密:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
解密后:

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

2.2 载荷(payload)
该部分一般存放一些有效的信息。JWT的标准定义包含五个字段:

  • iss:该JWT的签发者
  • sub:该JWT所面向的用户
  • aud:接收该JWT的一方
  • exp(expires):什么时候过期,这里是一个Unit的时间戳
  • iat(issued at):在什么时候签发的

2.3签证(signature)
JWT最后一个部分。该部分是使用了HS256加密后的数据;包含三个部分:

  • header(base64后的)
  • payload(base64后的)
  • secret 私钥,secret是保存在服务器端的,JWT的签发生成也是在服务器端的,secret就是用来进行JWT的签发和JWT的验证,所以,它就是你服务端的秘钥,在任何场景都不应该流露出去。一旦客户端得知这个secret,那就意味着客户端可以自我签发JWT了。

2.4 解密调试器
官网的加密串解密调试器:https://jwt.io/#debugger-io

spring boot jwt 例子 spring boot jwt token_spring boot jwt 例子

三、如何使用JWT?
3.1 工作原理
在身份鉴定的实现中,传统的方法是在服务端存储一个 session,但是如果是大并发系统服务器内存占用将不可控,给客户端返回一个 cookie。而使用JWT之后,当用户使用它的认证信息登录系统之后,会返回给用户一个JWT, 用户只需要本地保存该 token(通常使用localStorage,也可以使用cookie)即可。当用户希望访问一个受保护的路由或者资源的时候,通常应该在Authorization头部使用Bearer模式添加JWT,其内容格式:

Authorization: Bearer <token>

请求header形如:

fetch('api/users', {
  headers: {
    'Authorization': 'Bearer ' + token
  }
})

Postman发起JWT请求Header的key为Authorization,Header的value为Bearer <token>,示意

spring boot jwt 例子 spring boot jwt token_客户端_02

因为用户的状态在服务端内容中是不存储的,所以这是一种无状态的认证机制。服务端的保护路由将会检查请求头 Authorization 中的JWT信息,如果合法,则允许用户的行为。由于JWT是自包含的,因此减少了需要查询数据库的需要。JWT的这些特征使得我们可以完全依赖无状态的特性提供数据API服务。因为JWT并不使用Cookie的,所以你可以在任何域名提供你的API服务而不需要担心跨域资源共享问题(CORS)。
3.2 流程介绍:

  • 用户使用账号和密码发出POST登录请求;
  • 服务器使用私钥创建一个JWT;
  • 服务器返回这个JWT给浏览器;
  • 浏览器将该JWT串放在请求头中向服务器发送请求;
  • 服务器验证该JWT


 

郭慕荣