Redis - Token & JWT 概念解析及双token实现分布式session存储实战

Token

  1. 定义:令牌,访问资源接口(API)时所需要的资源凭证

一、Access Token

  1. 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端

  2. 组成

    组成部分 说明
    uid 用户唯一的身份标识
    time 当前时间的时间戳
    sign 签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串
  3. 验证流程

    1. 登录:客户端使用 username & password 请求登录
    2. 验证:服务端收到请求,验证 username & password
      1. 验证成功 → 服务端会签发一个 token 并把这个 token 发送给客户端
      2. 验证失败 → 登录失败
    3. 存储 token:客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里
    4. 携带 token:客户端每次向服务端请求资源的时候需要携带服务端签发的 token(放在 HTTP 的 Header 中)
    5. 解析 token:服务端收到请求,解析客户端的 token 数据
      1. 验证成功 → 向客户端返回请求的数据
      2. 验证失败 → 拒绝请求,要求重新登录

二、Refresh Token

  1. 定义:专用于刷新 access token 的 token

  2. 功能:减少重复登录操作,Access Token 失效时,客户端直接用 refresh token 去更新 access token,无需用户进行额外的操作

  3. 存储位置:服务器的数据库

  4. 工作流程


JWT

一、概述

  1. 定义:JSON Web Token(简称 JWT),一种认证授权机制,是目前最流行的跨域认证解决方案
  2. 功能:实现跨域请求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录(session 所有数据都保存在客户端,每次请求都发回服务器)
  3. 存储位置:HTTP 请求的头信息 Authorization 字段中,格式为:Authorization: Bearer <token>
  4. 基本格式:(Header.Payload.Signature)

二、组成部分

  1. Header

    1. 定义:描述 JWT 的元数据(配置信息),记录令牌类型、签名算法等配置,由 Base64URL 算法转为字符串

    2. 示例

      复制代码
      {
        "alg": "HS256",        // 签名算法类型
        "typ": "JWT"           // Token类型
      }
  2. Payload

    1. 定义:记录用户信息的数据(不是加密数据,不能存敏感信息)

    2. 示例

      复制代码
      {
        "sub": "1234567890",
        "name": "John Doe",
        "admin": true
      }
  3. Signature

    1. 定义:对前两部分(Header和Payload)的数字签名,用于验证消息的完整性和确保数据未被篡改。这是JWT安全性的核心保障

    2. 生成过程:

      1. 服务器持有一个密钥(secret),该密钥必须妥善保管且不能泄露
      2. 使用Header中指定的签名算法(默认为HMAC SHA256)
      3. 将编码后的Header和Payload用"."连接,再使用密钥和签名算法生成签名
    3. 获取签名方式:

      复制代码
      HMACSHA256(
        base64UrlEncode(header) + "." +
        base64UrlEncode(payload),
        secret)

三、优缺点

  1. 优点
    1. JWT 是自包含的(内部包含了一些会话信息),因此减少了查询数据库的需要,有效使用 JWT,可以降低服务器查询数据库的次数
    2. JWT 不仅可以用于认证,也可以用于交换信息
    3. JWT 并不使用 Cookie 的,所以可以使用任何域名提供你的 API 服务而不需要担心跨域资源共享问题(CORS)
  2. 缺点
    1. JWT 的最大缺点:由于服务器不保存 session 状态,因此无法在使用过程中废止或更改某个 token 的权限。一旦 JWT 签发,在到期之前就会始终有效
    2. JWT 默认不加密,但也是可以加密(生成原始 Token 以后,可以用密钥再加密一次)
    3. JWT 不加密的情况下,不能将秘密数据写入 JWT
    4. JWT 本身包含了认证信息,一旦泄露,任何人都可以通过 JWT 获得该 JWT 的所有权限

四、工作流程


相关推荐
Lhappy嘻嘻1 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
伊玛目的门徒2 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
ffqws_2 小时前
Redis 分布式锁:基于 Redisson 的实现与面试高频问答
redis·分布式·面试
懒鸟一枚4 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123456 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑6 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ8 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案8 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅9 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp9 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维