-
Notifications
You must be signed in to change notification settings - Fork 20
Description
背景
我们都知道http是无状态的,所以服务端为了标识客户端,服务端一般会使用session + cookie的方式,这种方式有一定的风险,比如CSRF(跨站请求伪造攻击)。
JSON Web Token是另一种方案,用户的信息不需要保留在服务端,保留在客户端就行了,服务端只需要验证这个信息是否可靠。
运行原理
JSON Web Token 是由服务端签发的 —— 可能使用公钥或者其它方式,为了防止被篡改,这些信息只能由服务端来维护,客户端只负责存储以证明自己的身份。
JWT一般分为三段:
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload),第三部分是签证(signature)。
1. Header
Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常有如下两段信息:
声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
2. Payload
Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用:
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
除了官方字段,还可以在这个部分定义私有字段。
3. Signature
Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
JWT存储和发送
存储方式不受限制:可以放在cookie里,也可以放在localStorage里,或者其它。
发送:JWT需要在每次请求服务端的时候带上。可以放在请求头里:
- cookie,可以自动发送,但是会有跨域的问题
- Authorization,Bearer
<token>
用途
- 单点登录
开源项目
JWT.io,是生成、解译、验证JSON Web Token的第三方库。
参考
JSON Web Token 入门教程
什么是 JWT -- JSON WEB TOKEN
JSON Web Tokens的实现原理