💻 spring boot 3.1.8
💻 spring security 6.1.6
개인 프로젝트에 스프링 시큐리티 프레임워크를 적용 후 로그인을 해본다.

로그인은 정상적으로 작동한다.

세션도 정상적으로 생성됨.

그런데 문제는...
로그아웃만 하면 에러가 뜨는 것.

대충 읽어보면 persistent_logins 라는 테이블에 문제가 있는 것 같다...
PreparedStatementCallback; bad SQL grammar [delete from persistent_logins where username = ?]
시큐리티를 쓰는데 저 테이블을 직접 생성했어야했나...? 내 기억으론 안그랬던 것 같은데...ㅠㅠ
암튼 SecurityConfig 문제인가 싶어서 SecurityFilterChain 문법도 버전에 따라 뜯어고쳐 보고...
build.gradle에서 의존성 주입한 Security 관련 버전도 건드려봤는데도 에러는 그대로...
그렇게 허우적거리다가 한 블로그를 통해 "직접" persistent_logins 테이블을 생성하는 팁을 받았다.
CREATE TABLE persistent_logins (
username varchar(64) not null,
series varchar(64) not null,
token varchar(64) not null,
last_used timestamp not null,
PRIMARY KEY (series)
);
그랬더니 로그아웃도 정상적으로 작동한다.
흠... 그런데 로그아웃을 해도 JSESSIONID가 삭제가 안되길래 로그아웃시 쿠키를 삭제하는 메서드를 추가했다.
http.formLogin()
.loginPage("/members/login")
.defaultSuccessUrl("/")
.usernameParameter("id")
.failureUrl("/members/login/error")
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/members/logout"))
.logoutSuccessUrl("/")
.deleteCookies("JSESSIONID");
;
이제 로그아웃 후 JSESSIONID도 정상적으로 삭제된다.

아마 내가 만든 SecurityConfig 코드들이 스프링 부트 2.x 버전과 스프링 시큐리티 5.x 버전에서 쓰이던 문법이라 그런 것이 아닐까...? 라고 짐작 중이다.
처음부터 끝까지 싹다 뜯어고쳐 마이그레이션 할 필요까지는 없어 보여서 조금씩 코드를 수정하는 선에서 마쳤다.