JWT Tutorial

为什么使用 JWT

JWT 是为了代替基于 session 的认证机制,使用 session 进行认证,服务端需要保存认证记录,难以应用在分布式应用上,扩展性差;另外,使用 cookie 进行识别,一旦被截获,容易受到跨站请伪造攻击。

  • 数据以明文形式存储在服务器上,不安全
  • session 实际上存储在文件系统中,高并发时服务器频繁处理文件读写,速度慢
  • 不适用于分布式应用

JWT 是什么

分为三部分

  • header
  • payload
  • signature

三个部分用

jwt 字符串:
1
2

```xxx.yyy.zzz

header 包含 token 的类型和使用的加密算法

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

将这个 JSON 使用 Base64Url 编码后就是 JWT 的第一部分

payload

这部分包含一些声明 claims,具体可能是一些实体信息或者元信息,严格来说分为三类:registered, public and private claims

1
2
3
4
5
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

同样的,也要经过 Base64Url 编码

signature

这部分是对前两部分的签名

1
2
3
4
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

是为了验证这个 JWT 属于谁,以及信息未改动

最后,把这三部分组合到一起,可以在 jwt.io 页面上验证正确性。

JWT 工作流程

JWT 2010.10 — 2015.05

JWT 的优势:

  • JWTs 包含详细信息
  • JWTs 不需要中心化发布
  • 支持 OAUTH2
  • JWT 数据可检验
  • JWTs 有失效时间控制

JWT 官网列出了几乎所有实现的 SDK,比如 PHP 中可以用 composer 方便地使用

1
composer require lcobucci/jwt

注意

JWT 的目标是将 API 作为认证用户的机制,而不是 Web 应用程序的登录机制