티스토리 뷰

IT/Spring

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

Stv 2025. 6. 24. 21:47

목차


    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 내부에서는 무슨일 이 벌어질까..?