x-access-token 是什么?在哪里?如何看过期时间
x-access-token 是什么?在哪里?如何看过期时间
创建时间:20241204
可能我们在一个网站上进行数据抓取的时候发现,不需要登录,不需要使用cookie也能访问,只需要headers全部复制下来即可,这就是以为有这个x-access-token的存在使得能够正常访问。
一、是什么?
1.1 定义与用途
x - access - token
通常是一个自定义的 HTTP 请求头(header)字段,用于在客户端和服务器之间传递身份验证信息。它的主要作用是向服务器表明客户端已经通过了某种认证流程,并且持有一个有效的访问令牌(access token),这个令牌允许客户端访问受保护的资源。- 例如,在一个基于 RESTful API 的 Web 应用程序中,当用户登录成功后,服务器会生成一个访问令牌并返回给客户端。之后,客户端在每次向服务器请求需要授权才能访问的资源(如用户的个人信息、特定的业务数据等)时,就会在请求头中添加
x - access - token
字段,并将这个访问令牌的值放入其中,服务器收到请求后,会验证这个令牌的有效性,以确定是否允许客户端访问请求的资源。
1.2 与身份验证系统的关系
- 基于令牌的身份验证(Token - Based Authentication):这种方式是
x - access - token
发挥作用的常见场景。在这种系统中,用户通过用户名和密码或者其他认证方式(如第三方登录)向认证服务器提交认证请求。认证成功后,认证服务器会生成一个访问令牌并发送给用户(客户端)。这个访问令牌包含了用户的身份信息和权限相关的内容,并且通常是经过加密处理的。 - 和其他身份验证方式对比:与传统的基于会话(Session - Based)的身份验证不同,令牌身份验证方式更加灵活。在基于会话的身份验证中,服务器会为每个登录的用户创建一个会话(Session),并在服务器端保存会话相关的信息。而在令牌身份验证中,服务器不需要在本地保存大量的会话信息,所有的身份验证和授权信息都包含在令牌中,由客户端持有并在每次请求时发送给服务器。
二、如何看有效期
2.1 从令牌内容本身判断-查看编码内容
如果x - access - token
是使用 JWT(JSON Web Token)格式,JWT 令牌由三部分组成,中间部分是负载(Payload),它是经过 Base64 编码的 JSON 数据。可以使用在线的 Base64 解码器对中间部分进行解码,解码后的内容可能包含exp
(expiration time,过期时间)字段。这个字段的值通常是一个 Unix 时间戳(从 1970 年 1 月 1 日 00:00:00 UTC 开始计算的秒数),通过将这个时间戳与当前时间进行比较,就可以判断令牌是否过期。
2.2 如下列子
x-access-token 为
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJoeWp5a2oiLCJleHAiOjE3MzMzODI1Njd9.c7m2d4vtIfGSLDst1rXv0HVIEhLuPuU6TRAWf8kJ8Wc
2.2.1 网站查询---使用base64解码网站和时间戳转化网站
我们可以得到中间的部分为负载。
随便找一个base64 的解码网站
https://www.toolhelper.cn/EncodeDecode/Base64
解码后我们可以看到 1733382567
过期时间的时间磋, 前面一个时登录名。
之后我们可以找一个时间磋转化的网站,这样就可以看到我们的过期时间为多少了
https://tool.lu/timestamp/
2.2.2 可以使用代码直接查询(python)
import jwt
import time
access_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJoeWp5a2oiLCJleHAiOjE3MzMzODI1Njd9.c7m2d4vtIfGSLDst1rXv0HVIEhLuPuU6TRAWf8kJ8Wc"
try:
decoded_token = jwt.decode(access_token, options={"verify_signature": False})
exp_timestamp = decoded_token.get('exp')
if exp_timestamp:
current_timestamp = int(time.time())
remaining_seconds = exp_timestamp - current_timestamp
days = remaining_seconds // 86400
remaining_seconds %= 86400
hours = remaining_seconds // 3600
remaining_seconds %= 3600
minutes = remaining_seconds // 60
remaining_seconds %= 60
print(f"令牌还有 {days} 天 {hours} 小时 {minutes} 分钟 {remaining_seconds} 秒过期")
else:
print("令牌中未包含过期时间戳信息")
except jwt.DecodeError:
print("无法正确解析令牌")
三、x-access-token 在网站什么位置
可以自己随便找几个网站看看有没有
四、和cookie和session的区别
比较项目 | x - access - token | Cookie | Session |
---|---|---|---|
存储位置 | 通常由客户端持有,存储在请求头中发送给服务器 | 存储在客户端浏览器 | 存储在服务器端 |
数据内容 | 包含用户身份信息和权限信息的加密字符串,如JWT格式包含用户标识、权限范围、过期时间等 | 以键值对形式存储信息,如用户登录状态、偏好设置等 | 存储与用户会话相关的各种数据,如登录信息、购物车内容等 |
工作方式 | 用户认证后服务器生成令牌给客户端,客户端每次请求带令牌,服务器验证令牌有效性 | 服务器发送给浏览器,浏览器在同源请求中自动发送回服务器,服务器据此识别用户相关信息 | 用户访问时服务器创建会话,生成会话ID给客户端(常通过Cookie),客户端携带ID,服务器依ID查找会话数据 |
优点 | 无状态性,便于服务器扩展;跨平台和跨域支持方便 | 方便实现会话管理和个性化服务 | 安全性相对较高;可以存储复杂数据 |
缺点 | 令牌安全性要求高;有效期管理复杂 | 易受跨站脚本攻击和跨站请求伪造威胁;大小和数量有限制 | 服务器资源消耗大;扩展性受限 |
适用场景 | 适合分布式系统、跨平台应用、无状态的API服务等 | 适用于简单的用户状态跟踪和个性化服务场景,如网站的语言偏好设置等 | 适用于需要在服务器端严格控制数据安全和存储复杂用户数据的场景,如电商购物车管理等 |