JWT全称json web token,是一种基于JSON的开放标准(RFC 7519)协议,适用场景比如现在流行的分布式环境当中,非常适用跨平台应用程序。
比较
· 传统的Session是保存在服务器当中,或者内存数据库。
· JWT保存的则是在客户端中。
结构
JWT由3个部分组成,用.分隔
· Header
· Payload
· Signature
JWT通常看起来像下面一样
xxxxx.yyyyy.zzzzz
Header
第一部分是请求头由两部分组成,alg与typ,第一个指定的是算法,第二指定的是类型。
例如:
{
"alg": "HS256",
"typ": "JWT"
}
Payload
第二部分是主体信息组成,用来存储JWT基本信息,或者是我们的信息。
例如:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature
第三部分主要是给第一部分跟第二部进行签名使用的,用来验证是否是我们服务器发起的Token,secret是我们的密钥。
下面例子使用HMAC SHA256算法进行签名
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
真正的JWT看起来像下面例子一样
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE1MTIyOTg4MDZ9.76mzRRk8CQfusjwxUMnIrME5ITyAPnNMdieJZhzaMc8
JWT工作原理
JWT SDK库支持
· .NET
· Python
· Node.js
· Java
· JavaScript
· Perl
· Ruby
· Elixir
· Go
· Haskell
· Rust
· Lua
· Scala
· D
· Clojure
· Objective-C
· Swift
· C
· kdb+/Q
· Delphi
· PHP
· Crystal
· 1C
JWT 主要依靠签名核心,也可自实现签名验证,主体信息存放。
评估
· 传统Cookie Session
优点:有成熟的存储方案,Session存储中使用最多的方案。
缺点:分布式环境中,会话一致是痛点。
· JWT
优点:分布式环境。
缺点:运算,不易控制攻击的Token。
虽然它们两个各有缺点,但只要把他们优点相互使用上,基本就是一个成熟稳定的解决方案了。
Node.js 例子
mkdir jwt
cd jwt
npm init
npm install jsonwebtoken --save
cat index.js
var jwt = require('jsonwebtoken');
var token = jwt.sign({foo:'bar'}, 'lake');
console.log(token)
官方提供各个语言版本 例子