双Token机制是一种用于用户认证和授权的安全方案,主要包括两个关键组件:Access Token 和Refresh Token。这种机制旨在提高系统的安全性和用户体验。
双Token机制的组件
1. Access Token(访问令牌)
- 作用:用于直接访问受保护的资源。
- 有效期:相对较短,通常为几分钟到几小时(例如1小时)。
- 使用方式:每次用户请求受保护资源时,都需要在请求头中携带Access Token进行身份验证。
2. Refresh Token(刷新令牌)
- 作用:用于在Access Token过期后获取新的Access Token。
- 有效期:较长,可以设置为几天甚至更长(例如1天)。
- 使用方式:Refresh Token不会频繁传输,通常只在获取新Access Token时使用,并安全地存储在客户端或服务器端
双Token机制的工作流程
-
用户登录:用户通过用户名和密码等凭证登录系统,服务器验证通过后,生成Access Token和Refresh Token,并将这两个Token返回给客户端。
javascriptjavascript // 示例:服务器返回Token const response = { accessToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGFuIjoiMjMwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c', refreshToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGFuIjoiMjMwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c' }; localStorage.setItem('accessToken', response.accessToken); localStorage.setItem('refreshToken', response.refreshToken);
-
访问受保护资源:用户在访问受保护资源时,需要在请求头中携带Access Token。
javascriptjavascript // 示例:携带Access Token访问资源 axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('accessToken')}`;
-
检测Token过期:如果Access Token过期,客户端使用Refresh Token请求新的Access Token。
javascriptjavascript // 示例:使用Refresh Token刷新Access Token function refreshToken() { axios.post('/api/refreshToken', { refreshToken: localStorage.getItem('refreshToken') }).then(response => { localStorage.setItem('accessToken', response.data.accessToken); localStorage.setItem('refreshToken', response.data.refreshToken); }).catch(error => { // 处理刷新Token失败或者Refresh Token过期的情况 }); }
-
服务器验证并返回新Token:服务器验证Refresh Token有效后,返回新的Access Token(和可选的新的Refresh Token)。
双Token机制的优点
- 安全性高:Access Token的短有效期减少了被盗用的风险,而Refresh Token的长有效期和较少传输提高了安全性
- 用户体验好:用户可以在一定时间内保持登录状态,不需要频繁登录
- 服务器负担小:服务器只需要验证Access Token,减少了服务器的负担
应用场景
双Token机制广泛应用于需要高安全性和良好用户体验的场景,如Web应用、移动应用和API服务
示例场景
假设有一个用户需要在后台管理界面上操作6个小时。使用双Token机制,用户可以在Access Token过期后使用Refresh Token获取新的Access Token,从而无需重新登录,提高了用户体验。同时,由于Access Token的有效期较短,即使被盗用,也不会导致长时间的安全风险。