问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

前端如何缓存token

创作时间:
作者:
@小白创作中心

前端如何缓存token

引用
1
来源
1.
https://docs.pingcode.com/baike/2563578

前端缓存token的常用方法有:LocalStorage、SessionStorage、Cookie。这些方法各有优缺点,选择合适的方式需要根据应用场景和安全需求来决定。本文将详细介绍这几种方式的优缺点,并推荐一些最佳实践。

一、LocalStorage

LocalStorage是一种持久化的存储方式,数据会一直存在,直到被手动删除。它的优点是持久化存储、简单易用、大容量。但是,它的安全性较低,容易被XSS攻击获取。

1.1 LocalStorage的优点

  • 持久化存储:数据不会因为浏览器关闭而丢失。
  • 大容量:通常浏览器允许每个域名存储5-10MB的数据。
  • 简单易用:使用 localStorage.setItem(key, value)localStorage.getItem(key) 来存储和获取数据。

1.2 LocalStorage的缺点

  • 安全性低:容易被XSS攻击。
  • 不适合敏感数据:因为数据是以明文存储在浏览器中,不适合存储敏感信息。

二、SessionStorage

SessionStorage是一种会话级别的存储方式,数据在浏览器关闭时会被自动删除。它的优点是会话级别存储、安全性较高,但容量较小,不适合大数据量存储。

2.1 SessionStorage的优点

  • 会话级别存储:数据在会话结束时自动删除,适合临时数据存储。
  • 安全性较高:相比LocalStorage,数据只存在于会话中,不会持久化到磁盘,减少了数据泄露的风险。
  • 简单易用:使用 sessionStorage.setItem(key, value)sessionStorage.getItem(key) 来存储和获取数据。

2.2 SessionStorage的缺点

  • 容量较小:通常浏览器允许每个域名存储5MB的数据。
  • 数据持久性差:浏览器关闭后数据会丢失,不适合需要持久化的数据存储。

三、Cookie

Cookie是一种通过HTTP请求头传递数据的存储方式,适合存储需要在客户端和服务端之间传递的数据。它的优点是数据传递方便、安全性较高,但容量小、操作复杂。

3.1 Cookie的优点

  • 数据传递方便:自动随每次HTTP请求发送到服务端,适合存储需要在客户端和服务端之间传递的数据。
  • 安全性较高:可以设置HttpOnly、Secure等属性,增加安全性。
  • 过期时间可控:可以设置过期时间,自动删除过期数据。

3.2 Cookie的缺点

  • 容量小:通常浏览器限制每个域名存储4KB的数据。
  • 操作复杂:需要手动设置和管理,使用不如LocalStorage和SessionStorage方便。
  • 性能影响:每次HTTP请求都会携带Cookie,增加请求大小,影响性能。

四、最佳实践

4.1 优先选择SessionStorage

在大多数情况下,优先选择使用SessionStorage来存储token,因为它的安全性较高,适合存储短期的会话数据。以下是一些最佳实践:

  • 设置合理的过期时间:确保token在会话结束时自动删除,减少数据泄露的风险。
  • 定期清理数据:在用户退出登录时,手动清理SessionStorage中的token。

4.2 使用HttpOnly Cookie

对于需要在客户端和服务端之间传递的数据,使用HttpOnly Cookie是一个更安全的选择。以下是一些最佳实践:

  • 设置HttpOnly属性:确保Cookie只能通过HTTP请求头传递,防止XSS攻击获取。
  • 使用Secure属性:在HTTPS连接中传输数据,增加传输安全性。
  • 设置合理的过期时间:确保Cookie在合理时间内自动删除,减少数据泄露的风险。

4.3 结合使用LocalStorage和SessionStorage

在某些情况下,可以结合使用LocalStorage和SessionStorage来存储token。例如,将长时间有效的refresh token存储在LocalStorage中,将短时间有效的access token存储在SessionStorage中。以下是一些最佳实践:

  • 定期刷新token:使用refresh token定期刷新access token,保证用户会话的持续性。
  • 清理过期数据:在用户退出登录时,手动清理LocalStorage和SessionStorage中的token。

五、具体实现

5.1 使用SessionStorage存储token

// 存储token
sessionStorage.setItem('token', 'your_token_here');
// 获取token
const token = sessionStorage.getItem('token');
// 清理token
sessionStorage.removeItem('token');

5.2 使用HttpOnly Cookie存储token

在服务端设置HttpOnly Cookie:

// 设置HttpOnly和Secure属性
res.cookie('token', 'your_token_here', {
  httpOnly: true,
  secure: process.env.NODE_ENV === 'production',
  maxAge: 3600000 // 1小时
});

在客户端获取token:

// 通过HTTP请求头获取token
const token = req.cookies.token;

5.3 结合使用LocalStorage和SessionStorage

在客户端存储refresh token和access token:

// 存储refresh token到LocalStorage
localStorage.setItem('refreshToken', 'your_refresh_token_here');
// 存储access token到SessionStorage
sessionStorage.setItem('accessToken', 'your_access_token_here');

定期刷新token:

// 获取refresh token
const refreshToken = localStorage.getItem('refreshToken');
// 使用refresh token刷新access token
fetch('/api/refresh-token', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ refreshToken })
})
.then(response => response.json())
.then(data => {
  // 更新access token到SessionStorage
  sessionStorage.setItem('accessToken', data.accessToken);
})
.catch(error => {
  console.error('Error refreshing token:', error);
});

在用户退出登录时清理token:

// 清理refresh token
localStorage.removeItem('refreshToken');
// 清理access token
sessionStorage.removeItem('accessToken');

六、总结

在前端缓存token时,需要根据应用场景和安全需求选择合适的存储方式。LocalStorage适合持久化存储、SessionStorage适合会话级别存储、Cookie适合客户端和服务端之间的数据传递。在实际应用中,优先选择SessionStorage存储token,结合使用HttpOnly Cookie增加安全性,并根据需要结合使用LocalStorage和SessionStorage。通过合理设置过期时间、定期清理数据等最佳实践,可以有效提高前端缓存token的安全性和可靠性。

本文原文来自PingCode

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号