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

简介

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

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

token 结构

header.claims.signature

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

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

{
  "alg" : "AES256",
  "typ" : "JWT"
}

Claims 声明

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

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Signature

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

一般有两个选择:

  1. HS256
  2. RS256

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

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

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

image

优点

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

缺点

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

node 模块

  • jsonwebtoken

 上一篇
Docker-BridgeNetwork原理 Docker-BridgeNetwork原理
参考资料 三层交换机 OSI 网络架构 七层网络架构 疑问 为什么已经有了链路层的交换机,还要有网络层的路由器呢? 为什么主机之间需要 MAC 地址才能进行通信? 有了 MAC 地址,为什么不直接通过 MAC : prot 进行发送数据?
2020-09-07
下一篇 
egg-graphQL源码分析 egg-graphQL源码分析
简介egg-graphQL 是 egg 的 graphQL 插件,规范化 GraphQL API 实现,自动创建 schema ,挂载 koa middleware 处理 GraphQL 请求,并且提供创建 GraphQL 开发者工具 源码
2020-07-14
  目录