【鉴权】深入解析 Token:身份认证的核心技术
目录
- 引言
- 一、Token 的定义与概念
- 1.1 Token 是什么?
- 1.2 无状态性与自包含性
- 1.3 Token 的工作流程
- 1.3.1 基本工作流程
- 1.3.2 工作流程图示
- 二、Token 的常见用途
- 2.1 用户身份验证
- 2.2 授权控制
- 2.3 防止跨站请求伪造(CSRF)
- 2.4 跨域认证
- 三、Token 的常见类型
- 3.1 JWT(JSON Web Token)
- 3.1.1 JWT 的结构
- 3.1.2 JWT 工作示意图
- 3.2 OAuth 2.0 Token
- 3.2.1 OAuth 2.0 的 Token 类型
- 3.3 API Token
- 四、Token 的优缺点
- 4.1 优点
- 4.2 缺点
- 五、Token 安全性和最佳实践
- 5.1 使用 HTTPS 加密通信
- 5.2 存储 Token 时要谨慎
- 5.3 设置 Token 有效期
- 5.4 签名和加密
- 5.5 避免 Token 过度暴露
- 5.6 处理 Token 失效和撤销
- 六、Token 的应用场景
- 6.1 Web 和移动应用的身份验证
- 6.2 单点登录(SSO)
- 6.3 微服务架构中的身份验证
- 6.4 第三方应用的授权
- 总结
引言
在现代 Web 开发中,身份认证(Authentication)是保证应用安全的重要一环。传统的基于会话(Session)的身份认证方式,在分布式架构和微服务环境中有诸多限制,而 Token 认证机制,尤其是 JWT(JSON Web Token),因其灵活性、无状态性和跨平台支持,逐渐成为业界的主流选择。
本文将深入解析 Token 的工作原理、常见类型、应用场景、安全性措施等内容,并通过图文帮助你更好地理解这一技术。
一、Token 的定义与概念
1.1 Token 是什么?
Token(令牌)是一个用于身份认证的凭证,通常是由服务器生成并返回给客户端。客户端在后续请求中携带该 Token,服务器通过解析 Token 验证用户身份,从而决定是否授权访问资源。Token 的一个显著特点是其 无状态性,这意味着服务器不需要存储关于用户会话的数据,而是通过解析客户端携带的 Token 来获取所有的身份信息。
1.2 无状态性与自包含性
-
无状态性:在 Token 认证机制中,服务器不需要保存任何关于会话的状态数据。每次请求,客户端都会在请求头中附带 Token,服务器通过解析 Token 来验证身份。这样的设计有助于减少服务器存储压力,尤其适合分布式和微服务架构。
-
自包含性:以 JWT 为代表的 Token,通常包含了用户的身份信息、权限信息等数据,这些信息直接存储在 Token 本身中。这样,服务器在接收到 Token 后无需查询数据库或其他后端服务,直接通过解析 Token 获取信息。
1.3 Token 的工作流程
1.3.1 基本工作流程
Token 认证的基本流程如下:
- 用户登录:用户通过登录界面提供用户名和密码,发送给服务器。
- 服务器验证并生成 Token:服务器验证用户身份(如验证用户名和密码),如果验证通过,生成一个 Token(例如 JWT),并返回给客户端。
- 客户端存储 Token:客户端收到 Token 后,将其存储在本地,常见的存储方式有
localStorage
、sessionStorage
或Cookie
。 - 客户端在后续请求中携带 Token:在随后的 HTTP 请求中,客户端将 Token 附加到请求头的
Authorization
部分。 - 服务器验证 Token:服务器解析 Token,验证其有效性,确保 Token 没有过期,并根据 Token 中的信息(如用户身份、权限等)判断是否允许访问相应的资源。
1.3.2 工作流程图示
如上图所示,Token 认证的流程非常直观。用户登录后,服务器返回 Token,客户端存储 Token 并在后续请求中携带该 Token,服务器验证并提供资源。
解释:
- 用户向服务器提交用户名和密码进行身份验证。
- 服务器返回一个 Token(如 JWT),该 Token 包含用户的身份信息和权限。
- 客户端将该 Token 存储在本地存储中,以便后续使用。
- 客户端在每次请求时,将 Token 通过 HTTP 请求头发送给服务器。
- 服务器根据 Token 验证用户身份和权限,授权访问资源。
二、Token 的常见用途
2.1 用户身份验证
Token 最常见的用途是进行用户身份验证。例如,当用户登录时,服务器通过验证用户名和密码,生成一个 Token,返回给客户端。在之后的请求中,客户端将该 Token 附加到请求中,服务器通过验证 Token 确认用户身份,并授权访问相关资源。
2.2 授权控制
Token 不仅包含身份信息,还可以包含关于用户角色、权限等信息。因此,服务器可以根据 Token 中的数据来判断用户是否有权访问某些资源。例如,后台管理系统可能基于 Token 中的角色信息来决定用户是否有权限访问管理页面或执行管理操作。
2.3 防止跨站请求伪造(CSRF)
传统的基于 Cookie 的身份认证机制容易受到 CSRF(跨站请求伪造)攻击,因为攻击者可以诱导用户访问恶意网站,从而利用用户的身份信息发起请求。而 Token 认证通过将身份信息存储在客户端,并通过 HTTP 请求头传递(而非通过 Cookie),从而有效防止了 CSRF 攻击。
2.4 跨域认证
在现代的前后端分离架构中,前端和后端通常分布在不同的域名下。Token 认证非常适合跨域认证,因为 Token 是通过 HTTP 请求头传递的,不受浏览器的跨域限制。因此,Token 机制可以方便地用于跨域认证。
三、Token 的常见类型
3.1 JWT(JSON Web Token)
JWT 是一种开放标准,用于在网络应用环境中传递声明。JWT 包含三部分:Header(头部)、Payload(载荷)、Signature(签名)。
3.1.1 JWT 的结构
JWT 的结构非常简单,由三部分组成:
-
Header(头部):通常包含 Token 的类型(即 JWT)和签名算法(如 HMAC SHA256 或 RSA)。
{"alg": "HS256","typ": "JWT" }
-
Payload(载荷):包含用户信息和其他元数据。JWT 中的 Payload 是 Base64Url 编码的,因此可以直接解码查看,但不应存储敏感信息。
{"user_id": "123","role": "admin" }
-
Signature(签名):签名用于验证 Token 是否被篡改。服务器使用 Header 和 Payload 部分以及密钥生成签名。
HMACSHA256(encode(Header) + "." + encode(Payload), SECRET_KEY)
3.1.2 JWT 工作示意图
JWT 的组成部分在传输中是编码的,可以确保在网络上传输时不会泄漏敏感数据。
3.2 OAuth 2.0 Token
OAuth 2.0 是一个授权框架,常用于授权第三方应用访问用户的数据。在 OAuth 2.0 中,Token 作为授权的凭证,允许第三方应用在不暴露用户凭证的情况下访问用户的资源。
3.2.1 OAuth 2.0 的 Token 类型
- Access Token:用于访问受保护的资源。Access Token 的有效期通常较短。
- Refresh Token:用于获取新的 Access Token。当 Access Token 过期时,客户端可以通过 Refresh Token 来重新获取一个新的 Access Token。
3.3 API Token
API Token 通常用于后台 API 的访问控制。API Token 是一种简单的身份认证方式,通常以字符串的形式存在,客户端将其附加到 HTTP 请求头中进行验证。API Token 适用于一些不需要用户登录的场景,或者在某些系统内部进行服务之间的身份验证。
四、Token 的优缺点
4.1 优点
优点 | 详细说明 |
---|---|
无状态 | 服务器无需存储会话数据,减轻了服务器的负担,适用于分布式架构和微服务。 |
跨平台支持 | Token 可以跨域、跨平台传递,适用于前后端分离的架构。 |
灵活性高 | 可以自定义 Payload,携带用户信息、权限等数据。 |
高效 | 无需频繁查询数据库或其他服务,验证过程通过解析 Token 完成。 |
支持跨域认证 | 使用 Token 作为身份认证机制,可以跨域验证,避免了 Cookie 的跨域限制。 |
4.2 缺点
缺点 | 详细说明 |
---|---|
Token 长度较大 | JWT 的大小通常较大,尤其是当 Payload 包含大量数据时,影响网络传输性能。 |
Token 被盗用风险 | 如果 Token 被窃取,攻击者可以利用它访问用户数据,因此需要妥善保管 Token。 |
不易撤销 | Token 一旦颁发并使用后,无法轻易撤销或失效,除非通过设置短有效期或实现其他机制来定期更新 Token。这使得 Token 的失效管理较为复杂。 |
五、Token 安全性和最佳实践
虽然 Token 认证机制相较于传统的会话认证具有许多优点,但也存在一些潜在的安全风险。为确保 Token 认证的安全性,以下是一些常见的安全最佳实践:
5.1 使用 HTTPS 加密通信
无论是 JWT 还是 OAuth 2.0 Token,都需要通过 HTTPS(安全的 HTTP)进行传输。这样可以确保 Token 在传输过程中不会被中间人窃取(即防止 Man-in-the-Middle 攻击)。在没有 HTTPS 的情况下,攻击者可能通过监听网络流量获取 Token,从而伪造身份。
5.2 存储 Token 时要谨慎
Token 不应存储在浏览器的 localStorage
或 sessionStorage
中,因为这些存储方式容易受到 XSS(跨站脚本攻击)攻击。更安全的做法是将 Token 存储在 HTTP-only 的 Cookie 中,这样可以防止 JavaScript 访问 Token,从而减少 XSS 攻击的风险。
- HTTP-only Cookies:通过设置 Cookie 的
HttpOnly
和Secure
标志,可以使 Cookie 只能通过 HTTP 请求发送,浏览器 JavaScript 无法访问。 - SameSite 属性:设置
SameSite
属性为Strict
或Lax
,可以防止跨站请求伪造(CSRF)攻击。
5.3 设置 Token 有效期
为了减少 Token 被滥用的风险,建议为 Token 设置适当的有效期。JWT 允许在 Payload 中设置 exp
(过期时间)字段,这样在过期后,Token 将自动失效,服务器不再接受该 Token。
- 短有效期:Token 的有效期应尽可能短,以降低被盗用的风险。例如,可以将 JWT 的过期时间设置为 15 分钟或 1 小时。
- 使用 Refresh Token:对于需要长期保持会话的应用,可以使用 Refresh Token 机制。当 Access Token 过期时,客户端可以使用 Refresh Token 获取一个新的 Access Token。
5.4 签名和加密
JWT 的安全性依赖于签名和加密机制,确保 Token 未被篡改和伪造。JWT 使用的 HMAC SHA256 或 RSA 等加密算法,能够验证 Token 的完整性。
- 使用强密码:确保签名密钥(secret key)足够复杂,避免使用简单或默认的密钥。可以使用环境变量来存储密钥,避免硬编码。
- 加密敏感数据:虽然 JWT 中的 Payload 是 Base64 编码的,但并不加密。因此,对于存储敏感信息(如密码、个人身份信息等),建议使用加密机制,而不仅仅是签名。
5.5 避免 Token 过度暴露
- 最小化信息暴露:JWT 的 Payload 可以存储身份信息,但不应存储敏感信息如密码、银行账户等。为了安全起见,尽量将敏感数据从 Token 中剔除,存储在服务器或数据库中,而只在 Payload 中存储必要的身份信息和权限。
- 避免泄露 Token:确保 Token 不会通过 URL 参数传递或通过浏览器的历史记录暴露。应通过 HTTP 请求头的
Authorization
字段传递 Token,这样更加安全。
5.6 处理 Token 失效和撤销
由于 Token 是自包含且无状态的,服务器在收到 Token 后无法直接得知其是否已经失效或被撤销。因此,Token 撤销机制需要通过以下方法之一实现:
- 短有效期:如前所述,通过设置短的有效期,可以减少 Token 被滥用的窗口。
- Token 黑名单:使用一个中央黑名单存储 Token,当用户登出或需要撤销 Token 时,可以将其添加到黑名单中,服务器在每次验证时检查 Token 是否在黑名单中。
- 使用 Refresh Token:通过定期刷新 Access Token,降低长时间有效的 Token 被滥用的风险。
六、Token 的应用场景
6.1 Web 和移动应用的身份验证
在传统的 Web 应用中,Token 常用于身份验证和权限控制。用户登录时,后端会返回一个 Token,客户端在随后的请求中携带该 Token 进行身份验证。这种方式特别适合于 前后端分离 的架构,其中前端和后端可以独立部署和扩展。
对于移动应用(如 iOS 和 Android),Token 认证机制也非常常见。在移动应用中,客户端会存储 Token,并在与服务器交互时附带 Token 进行身份验证。这种方式不仅能减轻服务器的负担,还能简化身份验证的流程。
6.2 单点登录(SSO)
单点登录(SSO, Single Sign-On)是指用户只需要登录一次,就可以访问多个不同的应用系统。Token 在单点登录中起着至关重要的作用。用户通过 SSO 系统登录后,SSO 系统会生成一个 Token,客户端可以使用该 Token 访问其他相关的应用系统,无需再次输入用户名和密码。
6.3 微服务架构中的身份验证
在微服务架构中,每个服务通常都有独立的身份验证和授权机制。Token 认证可以帮助微服务之间实现跨服务的身份验证。通过 Token,微服务之间可以无缝地验证请求来源,确保请求者具备必要的权限。
6.4 第三方应用的授权
在 OAuth 2.0 中,Token 被广泛应用于第三方应用授权。例如,用户可以使用 Google、Facebook 等第三方账号登录某个应用,授权该应用访问用户的基本信息。OAuth 2.0 使用 Access Token 和 Refresh Token 来管理这种跨应用的授权和认证。
总结
Token 认证是现代 Web 和移动应用中最常见的身份验证方式之一。它通过减少服务器存储会话的需求、增强跨平台支持以及提高灵活性,成为了前后端分离、微服务架构、跨域认证等场景的首选解决方案。尽管 Token 认证机制相较于传统的会话认证有许多优点,但它也带来了新的安全挑战。因此,在使用 Token 认证时,开发者需要遵循最佳实践,如使用 HTTPS、妥善存储 Token、设置合理的 Token 过期时间、签名和加密等措施,确保系统的安全性和可靠性。
随着技术的发展,Token 认证机制仍在不断进化。未来,我们可能会看到更多创新的身份验证和授权方案,这些方案将在安全性、易用性、性能等方面进一步优化和提升。
相关文章:
【鉴权】深入解析 Token:身份认证的核心技术
目录 引言一、Token 的定义与概念1.1 Token 是什么?1.2 无状态性与自包含性1.3 Token 的工作流程1.3.1 基本工作流程1.3.2 工作流程图示 二、Token 的常见用途2.1 用户身份验证2.2 授权控制2.3 防止跨站请求伪造(CSRF)2.4 跨域认证 三、Token…...

FastReport将停止 .NET Framework 上的 WebReport 更新
从2024/ 12 /1 日起,Fastreport将停止发布更新和提供对 FastReport.Web (.NET Framework) 的技术支持。该库一直是使用 Online Designer 的许多项目中报告的核心。这些更改意味着 FastReport.Web (Legacy) 库(FastReport.Net包的一部分)将不再…...

面试:TCP、UDP如何解决丢包问题
文章目录 一、TCP丢包原因、解决办法1.1 TCP为什么会丢包1.2 TCP传输协议如何解决丢包问题1.3 其他丢包情况(拓展)1.4 补充1.4.1 TCP端口号1.4.2 多个TCP请求的逻辑1.4.3 处理大量TCP连接请求的方法1.4.4 总结 二、UDP丢包2.1 UDP协议2.1.1 UDP简介2.1.2…...
在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码
在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码 在Ubuntu下安装RabbitMQ可以按照以下步骤进行:步骤 1: 更新系统步骤 2: 安装Erlang步骤 3: 添加RabbitMQ仓库步骤 4: 更新APT索引并安装RabbitMQ步骤 5: 启动RabbitMQ服务步骤 6: 检查RabbitMQ状态步骤 7: …...
HTTPS通信和TCP通信有什么不一样
HTTPS通信和TCP通信的主要区别如下: 协议层次:HTTPS是应用层协议,建立在HTTP协议之上,并增加了SSL/TLS加密层;而TCP是传输层协议,提供可靠的数据传输服务。安全性:HTTPS通过SSL/TLS加密…...

Kafka 的一些问题,夺命15连问
kafka-中的组成员 kafka四大核心 生产者API 允许应用程序发布记录流至一个或者多个kafka的主题(topics)。 消费者API 允许应用程序订阅一个或者多个主题,并处理这些主题接收到的记录流 StreamsAPI 允许应用程序充当流处理器(s…...

unity3d————延时函数
1.public void InvokeRepeating(string methodName, float time, float repeatRate); 延迟重复执行函数 InvokeRepeating 参数一:函数名字符串 参数二:第一次执行的延迟时间 参数三:之后每次执行的间隔时间 注意: 1-1.延时函数第…...
计算机学生自我提升方法——善用搜索引擎
计算机学生自我提升方法——善用搜索引擎 在信息爆炸的时代,计算机专业的学生如何有效地自我提升?答案可能就藏在一个简单却强大的工具——搜索引擎中。搜索引擎不仅是获取知识的入口,更是解决问题的利器。下面,我将分享一些善用…...

游戏引擎学习第一天
视频参考: https://www.bilibili.com/video/BV1zGDCYHErA/ 创建一个保存项目的路径 VS的安装略过,个人自行百度 1. vs 创建第一个CMAKE的窗口项目 game.cpp 修改如下的代码 到https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain 去…...
uni-app view循环绑定click和 v-if
<view class"layout-wrap-item" v-for"(item, index) in menuItems" :key"index" click"item.clickHandler" :v-if"showMenu(item)"></view> const xxx (id) > { }; // 定义菜单项数组 const menuItems …...

Redis 高并发分布式锁实战
目录 环境准备 一 . Redis 安装 二:Spring boot 项目准备 三:nginx 安装 四:Jmeter 下载和配置 案例实战 优化一:加 synchronized 锁 优化二:使用 redis 的 setnx 实现分布式锁 优化三:使用 Lua 脚本…...

关于elementui el-radio 赋值问题
今天遇到这样的问题: 点击的时候,同时选中 照抄官网! 后来发现了问题: 也就是说如果你的版本太低,就不能用value,而得用label,于是修改 <el-radio-group v-model"searchTime"&g…...

2024-11-6----Android 11(全志713m)----- 关于添加 Selinux 权限
需求 节点: /sys/devices/platform/motor0/motor_ctrl上层 APP 使用 JNI 需要对该节点进行 echo 的操作,操作失败。 添加前的验证工作 adb 进去验证下,如下图所示: 发现权限不够。su 以后再操作是OK的,如下图: 添加前的修改 为防止报权限错误,直接给777,因为该…...
shodan5(泷羽sec)
声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了…...

【Linux】Ansible集中化运维工具(详解)安装、常用模块、playbook脚本
文章目录 一、Ansible安装及远程控制1、关闭防火墙和SELinux2、安装ansible3、配置SSH无密码登录1、在管理机上生成一对密钥2、将公钥下发到远程主机3、保管密钥 4、主机目录 二、常用模块1、setup模块2、copy模块3、file模块4、shell模块5、script模块6、ping模块7、group模块…...

惠州石湾DELL T130服务器黄灯不开机案例
惠州石湾一个朋友反馈一台DELL PowerEdge T130 塔式服务器故障为 通电后无法开机,前面同时亮3个故障灯。闪电灯,电压灯,高温灯 1:这种情况建议大家更换一个同型号的电源进行故障排除。 2:朋友把该服务器硬件最小化测…...

⭐SmartControl: Enhancing ControlNet for Handling Rough Visual Conditions
目录 0 Abstract 1 Motivation 2 Related Work 2.1 Text-to-Image Diffusion Model 2.2 Controllable Text-to-Image Generation 2.3 ControlNet 2.4 Control Scale Exploration 3 Method 3.1 Framework 3.2 Control Scale Predictor 3.3 Unaligned Data Constructi…...
wordpress站外调用指定ID分类下的推荐内容
在WordPress中,如果你想从站外调用指定ID分类下的推荐内容,你可以使用WordPress REST API来实现。以下是一个基本的步骤指南: 1. 启用REST API 确保你的WordPress站点已经启用了REST API。大多数现代WordPress版本默认启用此功能。 2. 获取…...

Ente: 我们的 Monorepo 经验
原文:manav - 2024.10.29 九个月前,我们切换到了 monorepo。在此,我将介绍我们迄今为止的切换经验。 这并不是一份规范性的建议,而是一个经验的分享,目的是希望能够帮助其他团队做出明智的决策。 与大多数岔路不同&…...
Kafka java 配置
前言: 大家好,大家在springboot项目中,经常采用 KafkaListener 做为消费者。这个是spring为我们封装的。 但是某些情况 注解的方式并不能满足需求。这个时候就需要手动版本了。 介绍: 我们已经集成spring-Kafka 就不需要再…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...