본문 바로가기
Spring/09. spring-security

.logout()과 .sessionManagement()

by 989898 2025. 3. 5.

1. .logout() - 로그아웃 설정

http
    .logout(logout -> {
        logout
            .logoutUrl("/auth/logoutAction.do") // 1️⃣ 로그아웃 URL 지정
            .deleteCookies("JSESSIONID") // 2️⃣ 로그아웃 시 쿠키 삭제
            .invalidateHttpSession(true) // 3️⃣ 세션 무효화
            .clearAuthentication(true) // 4️⃣ 인증 정보 제거
            .logoutSuccessUrl("/index.do"); // 5️⃣ 로그아웃 후 이동할 페이지 지정
    });

✔️ .logout() 메서드는 Spring Security에서 제공하는 로그아웃 기능을 활성화하고, 동작을 커스텀하는 역할을 합니다.


🔹 (1) logoutUrl("/auth/logoutAction.do") - 로그아웃 요청 URL 설정

.logoutUrl("/auth/logoutAction.do")

 

✔️ 사용자가 /auth/logoutAction.do 경로로 POST 요청을 보내면 Spring Security가 자동으로 로그아웃 처리
✔️ 로그아웃 요청 시 Spring Security가 직접 처리하기 때문에 컨트롤러에서 따로 구현할 필요 없음
✔️ 기본값은 /logout이지만, 원하는 URL로 변경 가능

📌 로그아웃 폼 예제

<form action="/auth/logoutAction.do" method="post">
    <button type="submit">로그아웃</button>
</form>

🔥 GET 요청으로 로그아웃하려면 .logoutRequestMatcher(new AntPathRequestMatcher("/auth/logoutAction.do", "GET")) 설정이 필요!


🔹 (2) deleteCookies("JSESSIONID") - 쿠키 삭제

.deleteCookies("JSESSIONID")

 

✔️ 로그아웃 시 세션 쿠키(JSESSIONID)를 삭제하여 서버와의 세션을 완전히 끊음
✔️ 보안을 위해 로그아웃 후에도 사용자가 이전 세션을 사용할 수 없도록 강제 만료 처리


🔹 (3) invalidateHttpSession(true) - 세션 무효화

.invalidateHttpSession(true)

 

✔️ 로그아웃 시 서버의 HttpSession을 완전히 제거
✔️ 세션에 저장된 사용자 정보나 데이터(예: 장바구니, 임시 저장 데이터 등)도 모두 삭제됨
✔️ 보안을 위해 반드시 설정하는 것이 좋음


🔹 (4) clearAuthentication(true) - 인증 정보 제거

.clearAuthentication(true)

 

✔️ SecurityContextHolder에 저장된 사용자 인증 정보를 제거
✔️ 로그아웃 후에도 세션이 유지되는 경우를 방지
✔️ 기본적으로 SecurityContextPersistenceFilter가 처리하지만, 강제적으로 보안을 강화하려면 true 설정 추천


🔹 (5) logoutSuccessUrl("/index.do") - 로그아웃 후 이동할 페이지 설정

.logoutSuccessUrl("/index.do")

 

✔️ 로그아웃이 완료되면 /index.do 페이지로 이동
✔️ 로그인 페이지(/auth/login.do)로 리다이렉트할 수도 있음 (.logoutSuccessUrl("/auth/login.do"))


2. .sessionManagement() - 세션 관리

http
    .sessionManagement(sessionManagement -> {
        sessionManagement
            .maximumSessions(1) // 1️⃣ 중복 로그인 방지 (최대 세션 수 1개)
            .sessionFixation().migrateSession() // 2️⃣ 세션 고정 공격 방지
            .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED); // 3️⃣ 세션 생성 정책 설정
    });

 

✔️ .sessionManagement()는 Spring Security에서 로그인 세션을 어떻게 관리할지 설정하는 메서드입니다.


🔹 (1) maximumSessions(1) - 중복 로그인 방지

.maximumSessions(1)

 

✔️ 한 계정당 최대 1개의 활성 세션만 허용
✔️ 다른 곳에서 로그인하면 기존 세션이 만료됨

🔥 maximumSessions(1).expiredUrl("/session-expired")를 추가하면, 세션이 만료되었을 때 이동할 페이지 설정 가능


🔹 (2) sessionFixation().migrateSession() - 세션 고정 공격 방지

.sessionFixation().migrateSession()

 

✔️ 로그인 시 새로운 세션을 생성하고 기존 데이터를 새 세션으로 복사
✔️ 세션 ID가 그대로 유지되면 공격자가 세션을 탈취할 가능성이 있기 때문에 로그인 시 새로운 세션을 부여

📌 세션 고정 공격 방지 옵션

설정값설명

migrateSession() 기본값. 새 세션을 만들고 기존 데이터를 복사
newSession() 새 세션을 만들고 기존 데이터는 유지하지 않음
none() 기존 세션을 유지 (보안상 위험)

🔹 (3) sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) - 세션 생성 정책 설정

.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)

 

✔️ Spring Security가 언제 세션을 생성할지를 결정
✔️ 기본적으로 SessionCreationPolicy.IF_REQUIRED가 설정됨

📌 세션 생성 정책 옵션

설정값설명

IF_REQUIRED 필요할 때만 세션 생성 (기본값)
ALWAYS 항상 세션을 생성
NEVER Spring Security에서 세션을 생성하지 않지만, 기존 세션이 있으면 사용
STATELESS 세션을 사용하지 않음 (REST API에서 주로 사용)

🔥 REST API에서는 STATELESS를 사용하여 세션이 아닌 JWT 등의 방식으로 인증 관리


3. .logout()과 .sessionManagement() 정리

설정 역할
.logoutUrl("/auth/logoutAction.do") 로그아웃 요청 URL 지정
.deleteCookies("JSESSIONID") 로그아웃 시 쿠키 삭제 (세션 완전 종료)
.invalidateHttpSession(true) 로그아웃 시 서버 세션 무효화
.clearAuthentication(true) 로그아웃 시 인증 정보 제거
.logoutSuccessUrl("/index.do") 로그아웃 성공 후 이동할 URL 설정
.maximumSessions(1) 중복 로그인 방지 (1개의 세션만 허용)
.sessionFixation().migrateSession() 세션 고정 공격 방지 (로그인 시 새 세션 발급)
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) 세션 생성 정책 설정 (기본값: 필요할 때만 생성)

4. 결론

✔️ .logout()은 Spring Security의 로그아웃 기능을 설정하는 메서드
✔️ .sessionManagement()는 로그인 세션을 어떻게 관리할지 결정하는 메서드
✔️ 로그아웃하면 세션과 인증 정보가 삭제되고, 쿠키(JSESSIONID)도 제거됨
✔️ 중복 로그인 방지(maximumSessions(1))와 세션 고정 공격 방지(sessionFixation().migrateSession())를 설정하면 보안을 강화할 수 있음