JWT- Java Web Token 原理

JWT是一个轻量级的规范,之前学习过,但一直没有什么应用。最近在做一个OAuth 2相关的项目,有用到JWT。于是,再复习一遍。

JWT是什么?

JSON Web Token (JWT) 是一个简洁的,自包含的,可安全的在两个模块之间传输。这是JWT.io给出的定义。

简洁: JWT的规模比较小,它的报文可以通过URL或者HTTP的POST参数,甚至插入在HTTP头中。

自包含:在JWT payload部分包含了所有的必须的信息。

JWT报文结构:

Header: Header通常包含两部分:typ token类型, alg 所用的hash算法

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

Payload:Payload部分是JWT的信息主体。Payload有三种申明信息:注册,公开和私有申明信息。

注册声明:这一类中,JWT推荐但不是要求必须的四个参数是:iss (issuer), exp (expiration time), sub (subject), aud (audience).

共有声明:这些可以被定义在那些使用JWT的规范中,例如OpenID Connect,例如name, give_name。但是注意,避免使用冲突。

私有声明:自定义的声明

例子:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Signature: 签名是一个利用算法对header和payload的组合的加密字符串。这个签名可防止信息的篡改但不能防止信息的泄露。所以在JWT中,不能包含敏感信息。

签名的算法过程:

1. header字符串用base64加密

2. payload字符串用base64加密

3. 前两者加密的结果用点号 (.)连接起来。heder在前,paload在后

4. 然后使用header头中的注明的算法,对这个字符串加密的结果就是签名。加密过程中还会用到一个secret字符串

如下算法示意:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
完整的 JWT字符串是base64(header).base64(paload).Signature


参考文章:

1. https://jwt.io/introduction/

你可能感兴趣的:(JWT- Java Web Token 原理)