UP | HOME

JWT - JSON Web Token

Table of Contents

原文: https://dev.to/siwalik/what-the-heck-is-jwt-anyway--47hg

JWT token 结构,分为三部分,通过 . 分隔 header.payload.signature

1 header

由两部分组成

  • token令牌类型 通常是 JWT
  • 使用的哈希算法 HMAC SHA256或者RSA等等

示例

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

这个JSON被Base64Url编码,构成JWT的第一部分

'use strict';

var header = { "alg": "HS256", "typ": "JWT" };
var enc_header = Buffer.from(JSON.stringify(header)).toString('base64');
// ► "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"

2 Payload

用于存放有效信息

有三种类型的声明(Claims):

  • 保留声明(Registered claims)预定义的声明, 一般如下
    • iss: 该JWT的签发者
    • sub: 该JWT所面向的用户
    • aud: 接收该JWT的一方
    • exp(expires): 什么时候过期,这里是一个Unix时间戳
    • iat(issued at): 在什么时候签发的
  • 公有声明(public claims)这些是使用JWT的那些标准化组织根据需要定义的
  • 私有声明(private claims) 这些是自定义的声明,用于在达成共识的多方之间共享信息

示例

{
   "exp": "2019-02-14",
   "message": "roses are red"
}

经过bash64编码成为第二部分内容

'use strict';

var payload = { "exp": "2019-02-14", "message": "roses are red" };
var enc_payload = Buffer.from(JSON.stringify(payload)).toString('base64');
// ► eyJleHAiOiIyMDE5LTAyLTE0IiwibmFtZSI6IkpvaG4gRG9lIn0

3 Signature

签名可以检查JWT不会被篡改

示例

'use strict';
const crypto = require('crypto');
var jwt_secret = "secret";
// enc_header and enc_payload are computed earlier
var signature = crypto.createHmac('sha256', jwt_secret).update(enc_header +"."+ enc_payload).digest('base64');
// ► 6C46KAaZGp6RjbSqGllfdQF7g8vXCp02NTSrz-PzeoI

最终的JWT token看起来是这样

var token = `${enc_header}.${enc_payload}.${signature}`;
// ► eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyMDE5LTAyLTE0IiwibWVzc2FnZSI6InJvc2VzIGFyZSByZWQifQ.0u-mkgLo5479CPjJJ4mXCwn2RW4dFT12fiYiopRWsZw

4 links

Author: lidashuang

Created: 2018-05-04 Fri 12:57

Emacs 25.3.3 (Org mode 8.2.10)