在Web与Capacitor跨端代码库中安全存储JWT刷新令牌的方案
Web与Capacitor移动端共享代码库的JWT刷新令牌安全存储方案
核心思路:后端不区分客户端,客户端自行适配令牌存储与传输
不用让后端判断请求来自Web还是移动端,而是让同一个登录端点兼容两种令牌处理逻辑,客户端根据自身环境选择对应方式。
方案1:双模式令牌输出,客户端按需处理
登录成功后,后端同时完成两个操作:
- 在响应体中返回
refresh_token - 设置HttpOnly、Secure、SameSite=Strict/Lax的Cookie,值为刷新令牌
客户端侧的共享代码库做针对性适配:
- 移动端(Capacitor):
- 拦截登录响应,从响应体提取
refresh_token,存入iOS Keychain或Android KeyStore - 后续调用刷新令牌接口时,从安全存储取出令牌,放在自定义请求头(如
X-Refresh-Token)中发送 - 忽略后端设置的Cookie,避免WebView Cookie池干扰
- 拦截登录响应,从响应体提取
- Web端:
- 直接忽略响应体中的
refresh_token,依赖浏览器自动携带HttpOnly Cookie - 刷新令牌请求无需手动处理Cookie,浏览器会自动发送
- 直接忽略响应体中的
后端刷新令牌接口只需同时支持两种令牌获取方式:优先从Cookie读取,如果没有则从请求头X-Refresh-Token读取,同一个接口即可兼容Web和移动端。
方案2:基于客户端环境封装统一请求层
在共享代码库中封装API请求工具(如基于Axios/Fetch),统一处理令牌逻辑:
- 登录响应处理:
- 通过
Capacitor.isNativePlatform()判断是否为移动端,若是则提取响应体令牌存入安全存储 - Web端直接依赖Cookie,不处理响应体令牌
- 通过
- 刷新令牌请求处理:
- 移动端从安全存储取出令牌,添加到请求头
- Web端不添加额外请求头,让浏览器自动携带Cookie
后端无需做任何客户端判断,只需要验证刷新令牌的有效性即可。
辅助安全措施:降低令牌泄露风险
配合以下措施进一步强化安全:
- 短生命周期访问令牌:设置访问令牌有效期为15-30分钟,减少令牌泄露后的影响范围
- 刷新令牌轮换:每次使用刷新令牌时,后端返回新的刷新令牌,旧令牌立即失效。Web端Cookie自动更新,移动端替换安全存储中的旧令牌
- 强制HTTPS:所有接口必须使用HTTPS,防止令牌被中间人窃取
- CSRF防护:Web端Cookie设置
SameSite=Strict,同时刷新令牌接口可配合CSRF令牌(登录时返回并存入localStorage,请求时通过X-CSRF-Token头携带),避免跨站请求伪造
内容的提问来源于stack exchange,提问作者kmypwn
相关产品推荐
相关产品推荐

