简介

用户提供用户名和密码给认证服务器,服务器验证用户提交的信息的合法性,如果验证成功则返回一个 token , 用户可以使用这个 token 访问服务器上受保护的资源。

示例代码:https://github.com/ddzyan/node-project/tree/master/jwt-auth

token 结构

  1. header.claims.signature

为了安全的在url中使用,所有部分都用 base64 URL-safe 进行编码处理

Header

简单声明了类型以及产生签名所使用的算法

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

Claims声明

表示要发送的用户详细信息。

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

Signature

签名的目的是为了保证上边两部分信息不被篡改。一般使用一个私钥通过非对称加密算法对 Header 和 Claims 进行混淆产生签名信息。

一般有两个选择:

  1. HS256
  2. RS256

RS256 (采用SHA-256 的 RSA 签名) 是一种非对称算法, 它使用公共/私钥对: 标识提供方采用私钥生成签名, JWT 的使用方获取公钥以验证签名。

HS256 (带有 SHA-256 的 HMAC 是一种对称算法, 双方之间仅共享一个 密钥。由于使用相同的密钥生成签名和验证签名, 因此必须注意确保密钥不被泄密

在开发应用的时候启用 JWT,使用 RS256 更加安全,可以将公钥提供给 JWT 使用方进行解密验签,而无需担心私钥丢失。而如果使用 HS256 则必须将密钥提供给 JWT 使用方进行验签,从而可能导致私钥丢失或者泄漏。

JWT认证模式介绍和原理分析 - 图1

优点

  • 服务器无状态化,可用于多台服务器之间的登录
  • 减少客户端登录次数,降低服务器压力

缺点

  • 用于加密的密钥如何被破解,则用户可以随意伪造
  • 由于客户端保存认证信息,则服务器认证通过后,在一段时间内将无法取消用户登录权限

node 模块

  • jsonwebtoken