JWT刷新令牌(RT)与访问令牌(AT)配置疑问咨询
嘿,我来帮你梳理下访问令牌(AT)的核心配置要点,结合你用PHP做后端、客户端调用的场景来说,应该会更贴合你的需求:
访问令牌(AT)的关键配置建议
1. 过期时间:短是核心原则
- AT的过期时间一定要尽可能短,推荐设置在5-15分钟区间。原因很直白:AT是直接用来调用业务接口的凭证,一旦被攻击者窃取,短有效期能大大压缩他们的作恶窗口。和刷新令牌(RT)的长有效期搭配,既能让用户不用频繁登录,又能把安全风险降到最低。
- 在PHP里生成JWT时,直接给
exp声明赋值当前时间加短时长就行,比如写time() + 300就是5分钟有效期。
2. 令牌内容:能简则简
- 别往AT里塞无关信息!只保留业务必需的字段:比如用户ID、角色标识、核心权限标签就够了。
- 毕竟AT是每次请求都要携带的(大多放在
Authorization请求头里),内容越精简,请求的开销就越小,尤其是移动端或弱网环境下体验更好。而且冗余信息少了,就算令牌泄露,暴露的用户数据也更少。
3. 签名算法:优先选非对称加密
- 如果你不是完全可控的闭环场景(比如仅自己开发的原生APP调用后端),别用HS256这类对称加密算法,优先用RS256非对称算法。
- 对称算法的密钥一旦泄露,攻击者就能伪造任意AT;非对称算法下,后端用私钥签名,客户端/前端只用公钥验证,安全性提升不止一个档次。用PHP的
firebase/php-jwt库的话,切换成RS256很简单,提前生成好RSA密钥对就行。
4. 客户端存储:配合后端做安全适配
- 虽然这是客户端的工作,但和后端配置息息相关:客户端要把AT存在安全的存储区域——移动端用iOS的Keychain或Android的Keystore,Web端别存在localStorage(容易被XSS攻击窃取),建议用HttpOnly Cookie或者内存变量。
- 你后端可以考虑支持两种AT携带方式:Header里的Bearer令牌,或者HttpOnly Cookie,根据不同客户端类型灵活适配。
5. 和刷新令牌的联动逻辑
- 当AT过期时,客户端会用RT调用后端的刷新接口换取新AT,这里有几个细节要注意:
- 刷新接口必须严格验证RT的有效性:比如检查是否在黑名单中、是否属于当前请求的用户等。
- 建议开启滚动刷新:每次用旧RT换AT时,同时返回一个新的RT(有效期重新计算),避免RT长期不变带来的泄露风险。
- 你的PHP后端需要维护一个RT存储(比如用Redis),记录所有有效的RT,用户主动登出或RT过期时及时移除。
6. 权限粒度:精准控制访问范围
- 如果你的业务有不同接口的权限区分,建议在AT里加入
scope或permissions字段,明确这个AT能访问的接口范围。 - 这样后端每个接口验证AT时,除了检查签名和过期时间,还能校验权限,避免一个AT就能访问所有接口,进一步缩小风险范围。
内容的提问来源于stack exchange,提问作者user1300214
相关产品推荐
相关产品推荐

