TIL - 20250816

juni·2025년 8월 16일

TIL

목록 보기
96/317

0816 Spring Security JWT 인증 파이프라인 구축


✅ 1. 여행 생성 API 구현

  • 사용자가 새로운 여행 계획을 생성할 수 있는 백엔드 API(POST /api/trips)를 구현했습니다.
  1. TripRequest (DTO): 클라이언트로부터 여행 생성에 필요한 데이터를 받기 위한 DTO로, @Valid를 통해 데이터 유효성을 검증합니다.
  2. TripService: TripRequest와 사용자 정보를 받아 Trip 엔터티를 생성하고 DB에 저장하는 핵심 비즈니스 로직을 담당합니다.
  3. TripController: API 엔드포인트를 외부에 노출하고, TripService를 호출하여 요청을 처리합니다.

✅ 2. JWT 인증 필터 적용 및 Security 설정

  • Stateless 인증을 완성하기 위해, 요청 헤더의 JWT를 검증하고 인증을 처리하는 JwtAuthenticationFilter를 구현하여 Spring Security 파이프라인에 통합했습니다.

➕ 인증 필터 처리 흐름

  1. 클라이언트가 요청 헤더에 JWT(Authorization: Bearer ...)를 담아 전송합니다.
  2. JwtAuthenticationFilter가 요청을 가로채 토큰을 추출합니다.
  3. JwtProvider.validateToken()을 통해 토큰의 유효성을 검증합니다.
  4. 토큰이 유효하면 사용자 정보를 추출하여 UsernamePasswordAuthenticationToken 객체를 생성합니다.
  5. 생성된 Authentication 객체를 SecurityContextHolder에 저장하여, 해당 요청이 인증되었음을 명시합니다.

SecurityConfig 설정

  • 커스텀 필터 등록: addFilterBefore()를 사용하여 우리가 만든 JwtAuthenticationFilter가 Spring Security의 기본 인증 필터보다 먼저 동작하도록 설정했습니다.
  • 접근 제어 (인가): permitAll()로 인증 없이 접근 가능한 경로(로그인, 회원가입 등)를, authenticated()로 인증이 필요한 경로(/api/**)를 명시하여 API를 보호합니다.

✅ 3. 인증된 사용자 정보 활용 (@AuthenticationPrincipal)

  • SecurityContextHolder에서 직접 사용자 정보를 꺼내는 번거로움을 줄이고, 컨트롤러에서 인증된 사용자 정보를 파라미터로 바로 주입받도록 개선했습니다.

  • @AuthenticationPrincipal: 이 어노테이션을 사용하면 JwtAuthenticationFilterSecurityContextHolder에 저장한 사용자 정보를 컨트롤러 메서드에서 간편하게 조회할 수 있습니다. 이는 코드의 가독성과 테스트 용이성을 크게 향상시킵니다.

// TripController.java 예시
@PostMapping
public ApiResponse<Void> createTrip(
    @Valid @RequestBody TripRequest request,
    @AuthenticationPrincipal UserDetailsImpl userDetails // 바로 주입받아 사용
) {
    tripService.createTrip(request, userDetails.getUsername());
    return ApiResponse.ok("여행이 성공적으로 등록되었습니다.");
}

📌 요약

  • 여행 정보를 생성하는 핵심 백엔드 API(TripService, TripController)를 구현했습니다.
  • 요청 헤더의 JWT를 검증하여 사용자를 인증하는 JwtAuthenticationFilter를 구현하고 SecurityConfig에 등록함으로써, 토큰 기반의 Stateless 인증 파이프라인을 완성했습니다.
  • @AuthenticationPrincipal을 활용하여 컨트롤러에서 인증된 사용자 정보를 간결하고 효율적으로 사용하도록 리팩토링했습니다.

0개의 댓글