[Spring Security] 로그아웃 에러

건빈·2024년 2월 8일

스프링 시큐리티

 

- 버전

💻 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 버전에서 쓰이던 문법이라 그런 것이 아닐까...? 라고 짐작 중이다.
처음부터 끝까지 싹다 뜯어고쳐 마이그레이션 할 필요까지는 없어 보여서 조금씩 코드를 수정하는 선에서 마쳤다.

profile
백엔드 개발자 지망생

0개의 댓글