feat: 세션 DB 이중 저장 — Redis 유실/재시작에도 로그인 유지
- auth_session 테이블에 세션 영속 백업(login 시 Redis+DB 동시 저장) - getSession: Redis 미스/장애 시 DB에서 복원 후 Redis 재수화(슬라이딩) - logout: Redis+DB 동시 삭제, 만료분 일별 정리(@Scheduled) - Redis 재시작으로 세션 전멸하던 주기적 로그아웃 해결 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -30,3 +30,20 @@ CREATE TABLE IF NOT EXISTS app_setting (
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
INSERT IGNORE INTO app_setting (id, signup_enabled) VALUES (1, 1);
|
||||
|
||||
-- ============================================================
|
||||
-- 세션 백업 (Redis 유실/재시작 대비 영속 저장). getSession 미스 시 DB에서 복원.
|
||||
-- ============================================================
|
||||
CREATE TABLE IF NOT EXISTS auth_session (
|
||||
token VARCHAR(64) NOT NULL COMMENT '세션 토큰',
|
||||
member_id BIGINT NOT NULL,
|
||||
login_id VARCHAR(50) NULL,
|
||||
name VARCHAR(100) NULL,
|
||||
role VARCHAR(20) NULL,
|
||||
provider VARCHAR(20) NULL,
|
||||
remember_me TINYINT(1) NOT NULL DEFAULT 0,
|
||||
expires_at DATETIME NOT NULL,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (token),
|
||||
KEY idx_auth_session_expires (expires_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.sb.web.auth.mapper.AuthSessionMapper">
|
||||
|
||||
<insert id="insert" parameterType="com.sb.web.auth.domain.AuthSession">
|
||||
INSERT INTO auth_session
|
||||
(token, member_id, login_id, name, role, provider, remember_me, expires_at, created_at)
|
||||
VALUES
|
||||
(#{token}, #{memberId}, #{loginId}, #{name}, #{role}, #{provider},
|
||||
#{rememberMe}, #{expiresAt}, NOW())
|
||||
ON DUPLICATE KEY UPDATE
|
||||
expires_at = #{expiresAt}
|
||||
</insert>
|
||||
|
||||
<select id="findByToken" resultType="com.sb.web.auth.domain.AuthSession">
|
||||
SELECT token, member_id, login_id, name, role, provider, remember_me, expires_at, created_at
|
||||
FROM auth_session
|
||||
WHERE token = #{token}
|
||||
</select>
|
||||
|
||||
<update id="updateExpiry">
|
||||
UPDATE auth_session SET expires_at = #{expiresAt} WHERE token = #{token}
|
||||
</update>
|
||||
|
||||
<delete id="delete">
|
||||
DELETE FROM auth_session WHERE token = #{token}
|
||||
</delete>
|
||||
|
||||
<delete id="deleteExpired">
|
||||
DELETE FROM auth_session WHERE expires_at < #{now}
|
||||
</delete>
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user