Skip to content

JSON Web Token #110

@coconilu

Description

@coconilu

背景

我们都知道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需要在每次请求服务端的时候带上。可以放在请求头里:

  1. cookie,可以自动发送,但是会有跨域的问题
  2. Authorization,Bearer <token>

用途

  1. 单点登录

开源项目

JWT.io,是生成、解译、验证JSON Web Token的第三方库。

参考

JSON Web Token 入门教程
什么是 JWT -- JSON WEB TOKEN
JSON Web Tokens的实现原理

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions