访问令牌(Access Token)
访问令牌(Access Token) 是什么?
访问令牌(Access Token)由授权服务器签发的短期凭据,客户端向 API 出示后即可代表用户或服务访问受保护资源。
访问令牌代表资源所有者授予客户端的授权,并被限定在特定的权限与受众范围内。在 OAuth 2.0(RFC 6749)与 OpenID Connect 中,访问令牌可以是不透明的——通过调用授权服务器的内省端点(RFC 7662)进行验证——也可以是自包含的 JWT,在本地通过签名验证。它通常按照 RFC 6750 承载在 Authorization: Bearer 请求头中,并且必须经由 TLS 传输。
普通持有者令牌的核心弱点在于:持有即等于权限。从浏览器存储、日志或代理处窃取到的令牌,任何人都可以重放。这推动了发送方绑定令牌的兴起。RFC 8705 将令牌绑定到客户端的 TLS 证书(在 cnf.x5t#S256 声明中记录其哈希值),RFC 9449(DPoP)则将令牌绑定到客户端持有的密钥对,要求每次请求都附带一个新鲜的已签名证明 JWT,从而使被重放的令牌在缺少私钥的情况下毫无用处。令牌窃取攻击——包括 Lapsus$ 中出现的会话/令牌重放,以及各类云环境的 "pass-the-token" 入侵——正是这些机制所要挫败的对象。
最佳实践:短有效期(以分钟计)、收窄作用域、严格校验 audience 与 issuer、拒绝 alg: none 的 JWT 把戏、配合 refresh token 进行续期,并避免将令牌存放在 JavaScript 可访问的存储中。对于高价值 API,应优先采用 DPoP 或 mTLS 绑定的令牌,而非普通持有者令牌。
flowchart LR RO[资源所有者] -->|授予同意| AS[授权服务器] C[客户端] -->|令牌请求加 DPoP 或 mTLS 密钥| AS AS -->|短期访问令牌<br/>scope 加 aud 加 cnf 声明| C C -->|持有者令牌加持有证明| RS[资源服务器或 API] RS -->|验证签名或内省<br/>检查 aud exp 与密钥绑定| RS RS -->|允许或拒绝| C
● 示例
- 01
一个 scope=read:invoices、exp 设为未来 15 分钟的 OAuth 2.0 访问令牌。
- 02
一个通过授权服务器 /introspect 端点验证的不透明令牌。
● 常见问题
访问令牌(Access Token) 是什么?
由授权服务器签发的短期凭据,客户端向 API 出示后即可代表用户或服务访问受保护资源。 它属于网络安全的 身份与访问 分类。
访问令牌(Access Token) 是什么意思?
由授权服务器签发的短期凭据,客户端向 API 出示后即可代表用户或服务访问受保护资源。
如何防御 访问令牌(Access Token)?
针对 访问令牌(Access Token) 的防御通常结合技术控制与运营实践,详见上方完整定义。