JWT(一):认识 JSON Web Token

JWT(一):认识 JSON WebToken
JWT(二):使用 Java 实现 JWT

什么是 JWT?

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,作为 JSON 对象在各方之间安全的传递信息。这个信息可以通过数字签名进行验证并信任。JWTs 可以使用密钥(结合 HMAC 算法)或者 使用 RSA 、 ECDSA 加密的公钥私钥对进行签名。

尽管 JWTs 能够在各方之间也提供安全加密,但是仍**专注于签名 Token **。当其他方隐藏了加密 Token 的某些声明时,签名 Token 可以验证声明的完整性。当Token使用公钥私钥对进行签名时,这个签名还能证明只有拥有私钥的一方才是签发它的一方。

什么时候使用 JWT ?

  • 授权:这是 JWT 最普遍的使用场景。当用户登录之后,每次请求中都包含 JWT ,服务端允许用户访问那些只有携带 token 才能访问的路由、服务、资源。目前在单点登录中广泛使用到 JWT ,因为它体积小,且能够在不同域名之间使用。
  • 信息交换: JWT 是一种能够在各方之间安全传输信息的好方式。因为 JWTs 能够签名,比如使用公钥私钥对,你能够确定发送者的身份。另外,签名是使用 Header 和 Payload 通过特定算法计算而来,所以你也可以验证内容是否被篡改。

JWT的结构

JWT 包含三部分,之间以点(.)连接

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

一个典型的 JWT 如同下面这样:

xxxxx.yyyyy.zzzzz

一个真实的 JWT 例子:

JWT(一):认识 JSON Web Token_第1张图片
encoded-jwt3.png

Header

Header部分 是一个 JSON 对象,典型的header包含两部分:

  • alg:使用的签名算法,比如 HMAC SHA256 或 RSA
  • typ:token的类型,比如 JWT
{
  "alg": "HS256",
  "typ": "JWT"
}

最后,用 Base64Url 将这个 JSON 对象编码后,作为 JWT 的第一部分

Payload

Payload 部分也是 JSON 对象,用来存放数据。JWT 有7个官方字段:

  • iss (issuer):签发人
  • exp (expiration time):过期时间,以秒为单位
  • iat (Issued At):签发时间,能够算出JWT的存在时间
  • nbf (Not Before):生效时间
  • jti (JWT ID):JWT 的唯一标识。用来防止 JWT 重复。
  • sub (subject):主题(很少使用)
  • aud (audience):token的受众(很少被使用)

除了上面这些字段,还可以自定义私有字段,比如

{
    "userId": "1101",
    "userName": "张三",
    "age": "23"
}

最后,用 Base64Url 将这个 JSON 对象编码后,作为 JWT 的第二部分

Tip: JWT 默认不加密,任何人都可以读取,所以不要把敏感信息存放在这个部分,除非加密过。

Signature

使用 Header 指定的算法对 Header、Payload、密钥三部分进行签名,生成的字符串作为 JWT 的第三部分。
比如使用 HMAC SHA256 算法进行签名:

HMACSHA256( 
    Base64Url.encode(header) + "." + Base64Url.encode(payload),
    secret
)

签名可以用来验证数据是否被篡改,而且如果 token 使用私钥进行了签名,那么该签名还可以验证 JWT 发送者的身份。

怎么使用 JWT ?

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次请求服务器,都要带上这个 JWT。所以可以把它放在 Cookie 里面自动发送,但是这样并不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面。

Authorization: Bearer 

另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。

JWT 的特点

  1. JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次
  2. JWT 不加密的情况下,不能将敏感数据写入 JWT
  3. JWT 不仅可以用于认证,也可以用于交换信息
  4. JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦签发了 JWT ,在到期之前就会始终有效
  5. JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
  6. 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

和 Session-Cookie 相比

Session-Cookie 方式:客户端每次请求都使用 cookie 携带 session_id ,服务器根据 session_id 区分不同的会话

JWT 方式:客户端每次请求都使用请求头携带 token,服务器根据 token 区分不同的用户

官网 JWT 介绍

你可能感兴趣的:(JWT(一):认识 JSON Web Token)