springboot学习第7期 - 前后端分离 JWT 认证

186 阅读1分钟

前后端分离 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'
);

实现

参考 github.com/congvee/log…