좋아, 이건 Spring Security 고급 기능에서 가장 중요한 3대 주제야.
아래 순서대로 정말 잘 정리해줄게.
Authorization: Bearer <token>을 보냄[1] 로그인 요청 (ID/PW)
↓
[2] 서버에서 사용자 인증 → JWT 발급
↓
[3] JWT를 클라이언트에 전달 (보통 Authorization 헤더 또는 쿠키)
↓
[4] 이후 요청에 JWT 포함 → 서버는 JWT를 검증하고 사용자 인증 처리
| 구성 요소 | 설명 |
|---|---|
JwtAuthenticationFilter | 요청에서 JWT를 꺼내고 검증하여 SecurityContext에 사용자 설정 |
JwtProvider | 토큰 생성, 검증 유틸 |
SecurityConfig | JWT 필터를 UsernamePasswordAuthenticationFilter 앞에 추가 |
UserDetailsService | 사용자 정보 조회 로직 |
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/login", "/signup").permitAll()
.anyRequest().authenticated()
);
클라이언트 요청
↓
SecurityContextPersistenceFilter
↓
UsernamePasswordAuthenticationFilter ← 로그인 인증
↓
ExceptionTranslationFilter ← 인증 실패/예외 처리
↓
FilterSecurityInterceptor ← 인가(권한) 검사
↓
컨트롤러 → 서비스 → 리포지토리
✅ 이 구조는 "필터 체인으로 처리되는 보안 흐름" 이며,
jwtFilter는 UsernamePasswordAuthenticationFilter 앞에 들어가야 정상 작동함.
| 기능 | 설정 방식 |
|---|---|
| 로그인 페이지 변경 | .formLogin().loginPage("/my-login") |
| 로그인 성공/실패 핸들러 | .successHandler(), .failureHandler() |
| 로그아웃 URL 변경 | .logout().logoutUrl("/logout") |
| 로그아웃 성공 후 이동 | .logoutSuccessUrl("/") |
| 세션 무효화, 쿠키 삭제 | .invalidateHttpSession(true).deleteCookies("JSESSIONID") |
http
.formLogin()
.loginPage("/login")
.successHandler(customSuccessHandler)
.failureHandler(customFailureHandler)
.and()
.logout()
.logoutUrl("/custom-logout")
.logoutSuccessUrl("/login?logout")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID");
| 항목 | 중요도 | 설명 |
|---|---|---|
| JWT 인증 | ★★★★★ | 세션 없는 토큰 기반 인증. 모바일/SPA 필수 |
| 필터 체인 구조 | ★★★★☆ | 보안 흐름 구조 이해에 필수 |
| 로그인/로그아웃 커스터마이징 | ★★★★☆ | 실무에서 사용자 경험 개선용 핵심 |
💡원하면:
같은 것도 바로 해줄게!
계속 해볼까? 😎