🔐 Spring Security & JWT 인증 흐름 완전 정복 - 로그인 인증부터 토큰 발급, 필터 구조

2025. 6. 24. 21:47Framework/Spring

1. Spring Security란?

Spring 기반 애플리케이션의 인증 (Authentication)과 인가(Authorization)를 담당하는 보안 프레임워크

 

🔐 기본 역할

  • 인증(Authentication) : 사용자가 누구인지 확인
  • 인가(Authorization) : 사용자가 특정 리소스에 접근 가능한지 확인

2. 인증 방식 비교

방식 설명 특징
세션 기반 인증 로그인 시 서버가 세션 생성, 클라이언트에 세션 ID 전달 서버 메모리에 상태 저장
JWT 기반 인증 로그인 시 토큰 생성, 클라이언트가 토큰을 저장 후 매 요청에 전송 서버는 상태 저장 X (무상태 stateless)
  • 최근엔 JWT 기반 인증 방식이 보편화 (특히 REST API)

🔑 3. JWT란?

JSON Web Token
인증 정보와 클레임을 JSON 형태로 인코딩한 자기 자신을 증명하는 토큰

 

구조

Header.Payload.Signature
  • Header : 알고리즘 정보 (예 : HS256)
  • Payload : 사용자 정보 (클레임, 예 : sub, exp, roles)
  • Signature : 비밀키로 서명 (변조 방지)

4. Spring Security 인증 흐름 (전체 구조)

[요청] → SecurityFilterChain →
    → UsernamePasswordAuthenticationFilter (or JwtAuthenticationFilter)
        → AuthenticationManager
            → UserDetailsService.loadUserByUsername()
                → User 객체 반환 → 인증 완료

5. JWT 기반 인증 흐름 요약

  1. 사용자 /login 요청 (ID/PW)
  2. 인증 성공 시 JWT 발급
  3. 클라이언트는 JWT를 Authorization : Bearer {token} 헤더에 담아 요청
  4. 서버는 매 요청마다 JWT를 검증하고 사용자 인증 처리

6. JWT 로그인 & 인증 필터 구현 흐름

✅1) 로그인 필터 (JwtAuthenticationFilter)

  • UsernamePasswordAuthenticationFilter를 상속
  • ID/PW를 검증하고, 성공 시 JWT 생성 후 응답 헤더 or 바디에 추가
Authentication auth = authenticationManager.authenticate(
    new UsernamePasswordAuthenticationToken(username, password));
String jwt = jwtTokenProvider.createToken(auth.getName(), auth.getAuthorities());
response.addHeader("Authorization", "Bearer " + jwt);

 

✅2) JWT 인증 필터 (JwtAUthorizationFilter)

  • 요청 헤더의 Authorization 값에서 JWT 추출
  • JWT 검증 -> 유효 시 SecurityContext에 인증 정보 등록
String token = resolveToken(request);
if (tokenProvider.validateToken(token)) {
    Authentication auth = tokenProvider.getAuthentication(token);
    SecurityContextHolder.getContext().setAuthentication(auth);
}

7. 주요 컴포넌트 정리

컴포넌트 역할
JwtTokenProvider 토큰 생성, 검증, 파싱 담당
UserDetailService 사용자 조회 및 인증 정보 생성
AuthenticationManager 인증 위임 처리
SecurityFilterChain 필터 등록 및 보안 규칙 설정

8. 실무 적용 전략

✅ 보안 강화 팁

  • 토큰에 exp, iat, sub, role 등의 클레임 명확히 포함
  • 만료 시간 (exp) 반드시 설정
  • Refresh Token 전략 도입하여 재발급 허용 
  • 민감 정보 (비밀번호 등)는 절대 포함 금지

✅ CORS 처리

  • 프론트와 분리된 SPA 환경에서는 반드시 CORS 정책 적용 

✅ 마무리 요약

항목 정리 포인트
Spring Security 인증/인가를 책임지는 보안 프레임워크
JWT 무상태 인증 방식, 토큰 기반
인증 흐름 로그인 -> JWT 발급 -> 요청마다 JWT 검증 후 인증 처리
실무 주의점 만료/재발급/권한설정 명확히, CORS, HTTPS 필수 적용

 

🔜 다음 포스팅에서는 Spring Boot 자동 설정 원리에 대해서 다뤄 보려고 한다. @EnableAutoConfiguration 내부에서는 무슨일 이 벌어질까..?