✅ 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())를 설정하면 보안을 강화할 수 있음
'Spring > 09. spring-security' 카테고리의 다른 글
| Spring Security는 로그인 & 로그아웃을 위한 API인가? (0) | 2025.03.05 |
|---|---|
| AuthenticationManager와 PasswordEncoder (0) | 2025.03.05 |
| Spring Security의 보안 구성 흐름 / 설정 설명 (0) | 2025.03.05 |
| Spirng Security 개념 및 동작 방식 정리 (0) | 2025.03.05 |
| Form-Login (0) | 2025.03.04 |