前后端分离 JWT 认证。
整体方案
采用双token:Access Token 和 Refresh Token。
Access Token 有效时间15min,通过 json 返回给前端,前端存储在内存中,每次请求将access token 通过请求头传递给后端进行认证。
Refresh token 有效时间 7 天,存放在 Cookie 中,设置 httponly,samesite=strict,secure=true。
由于 access token 是存放在前端内存中,所以当刷新页面的时候,access token会丢失,需要重新请求 /refresh 接口刷新token。
退出登录的逻辑是将 refresh token 立即失效,并且前端内存的access token 也丢失了,就无法继续携带token。
虽然设置cookie中的refresh token立即失效,并不意味着refresh token不可用,如果refresh token泄露,则也可以重新调用刷新token接口,因为token只是当时的快照,过期时间还是一开始设置的 7 天。如果需要进一步增加安全性,可以使用redis存储refresh token,当调用退出登录接口,不仅仅从cookie层面立即失效,还需要将redis中的refresh token也删除掉。
技术栈
后端
springboot3
spring security
spring data jpa (可以换成mybatis-plus)
mysql
flyway
jwt
前端
vue3
axios
数据表设计
只涉及用户表。
CREATE TABLE tbl_user (
id bigint unsigned auto_increment primary key,
username varchar(128) not null unique,
password varchar(128) not null,
is_deleted tinyint(1) unsigned not null default 0,
created_at datetime not null default current_timestamp,
updated_at datetime not null default current_timestamp on update current_timestamp,
created_by varchar(50) not null default 'system',
updated_by varchar(50) not null default 'system'
);