MST

星途 面试题库

面试题:安全认证:如何设计基于OAuth的多端应用中访问令牌与刷新令牌的安全存储

假设你正在开发一个同时支持Web、移动端的应用,基于OAuth进行安全认证。请描述你会如何设计访问令牌与刷新令牌在不同端(浏览器、移动设备)的安全存储方式,以防止令牌泄露,并列举可能面临的安全风险及应对措施。
37.5万 热度难度
后端开发安全认证

知识考点

AI 面试

面试题答案

一键面试

一、访问令牌与刷新令牌在不同端的安全存储方式

  1. 浏览器端
    • HttpOnly Cookie
      • 存储方式:将访问令牌和刷新令牌存储在HttpOnly Cookie中。这样设置后,JavaScript无法访问该Cookie,减少了XSS(跨站脚本攻击)窃取令牌的风险。例如,在服务器端设置响应头:Set - Cookie: access_token=xxx; HttpOnly; SecureSecure表示仅在HTTPS连接下传输)。
      • 优势:有效防止XSS攻击获取令牌。
      • 劣势:由于JavaScript无法访问,在单页应用(SPA)等需要前后端交互频繁的场景下,使用可能受限。
    • LocalStorage + 加密
      • 存储方式:先在客户端使用加密算法(如AES)对令牌进行加密,然后将加密后的令牌存储在LocalStorage中。每次使用时,先从LocalStorage读取加密后的令牌,再进行解密。例如,使用CryptoJS库进行加密:var encryptedAccessToken = CryptoJS.AES.encrypt('access_token_value', 'secret_key'); localStorage.setItem('encryptedAccessToken', encryptedAccessToken.toString());
      • 优势:可用于SPA场景,便于前端获取和使用。
      • 劣势:如果加密密钥泄露,令牌仍可能被解密获取;并且LocalStorage本身存在安全风险,如XSS攻击可获取其中数据。
  2. 移动设备端
    • Keychain(iOS)/ Keystore(Android)
      • 存储方式:在iOS设备上,使用Keychain存储令牌。例如,通过Security.framework提供的API进行存储和读取。在Android设备上,使用Keystore存储。例如,通过Android Keystore System提供的API,将令牌以安全的方式存储。
      • 优势:这是操作系统提供的安全存储机制,具有较高的安全性,能防止应用被破解后令牌轻易被获取。
      • 劣势:不同平台API使用方式不同,开发需要适配不同平台代码。
    • SharedPreferences(Android)/ UserDefaults(iOS) + 加密
      • 存储方式:类似于浏览器端LocalStorage + 加密的方式。在Android上,先对令牌加密,然后存储在SharedPreferences中;在iOS上,对令牌加密后存储在UserDefaults中。例如,在Android中:SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("encryptedAccessToken", encryptedAccessToken.toString()); editor.apply();
      • 优势:方便在应用内获取和使用令牌。
      • 劣势:同样存在加密密钥泄露的风险,且相比Keychain/Keystore安全性稍低。

二、可能面临的安全风险及应对措施

  1. XSS(跨站脚本攻击)
    • 风险:攻击者在网页中注入恶意脚本,窃取存储在浏览器中的令牌(如果未使用HttpOnly Cookie)。
    • 应对措施:使用HttpOnly Cookie存储令牌;对用户输入进行严格的过滤和转义,防止恶意脚本注入;启用内容安全策略(CSP),限制页面可加载的资源来源,降低XSS攻击成功的可能性。
  2. CSRF(跨站请求伪造)
    • 风险:攻击者利用用户已登录的状态,在用户不知情的情况下,伪造请求发送到目标应用,利用存储的令牌执行操作。
    • 应对措施:在请求中添加CSRF令牌,每次请求时,服务器验证CSRF令牌的有效性;使用Same - Site Cookie属性,设置为StrictLax,限制Cookie在跨站请求中的发送。
  3. 中间人攻击(MITM)
    • 风险:攻击者拦截网络通信,获取传输中的令牌。
    • 应对措施:使用HTTPS协议进行通信,对数据进行加密传输;在移动设备上,验证服务器证书的有效性,防止中间人伪造证书。
  4. 应用被破解
    • 风险:在移动设备上,如果应用被破解,攻击者可能获取存储在应用内的令牌。
    • 应对措施:使用Keychain/Keystore存储令牌;对应用进行代码混淆,增加破解难度;定期对应用进行安全审计和漏洞扫描。
  5. 加密密钥泄露
    • 风险:如果采用加密存储令牌的方式,加密密钥泄露会导致令牌被解密获取。
    • 应对措施:妥善保管加密密钥,避免硬编码在代码中;使用安全的密钥管理服务;定期更新加密密钥。