Project/ParkingService

20250220 TIL JWT 기반 인증 기능 및 단위 테스트 구현

Albosa2lol 2025. 2. 20. 16:02

JWT 기반 인증 기능 및 단위 테스트 정리

🔹 구현된 주요 기능

1️⃣ 사용자 인증 & JWT 발급

  • AuthController
    • POST /auth/login
      → 로그인 요청 시, 유효한 사용자면 JWT 토큰 발급
    • POST /auth/register
      → 신규 사용자 회원가입

2️⃣ JWT 토큰 생성 & 검증

  • JwtUtil
    • generateToken(username)
      HMAC SHA 키 기반 JWT 토큰 생성
    • extractUsername(token)
      → 토큰에서 사용자 정보(Username) 추출
    • isTokenExpired(token)
      토큰 만료 여부 확인 (예외 발생 방지)
    • validateToken(token, username)
      토큰 유효성 검증 (사용자명 일치 여부 포함)

3️⃣ Spring Security & JWT 적용

  • SecurityConfig
    • SecurityFilterChain
      → Spring Security 설정을 통해 JWT 기반 인증 필터 적용
    • JwtAuthenticationFilter
      JWT 검증 및 인증 필터 추가

🔹 작성된 단위 테스트 & 검증 항목

🔹 JwtUtilTest (JWT 유틸리티 클래스 테스트)

JWT 생성 & 유효성 검증

  • testGenerateAndValidateToken()
    JWT 생성 후 유효성 검증 (validateToken() 정상 동작 확인)

만료된 토큰 검증

  • testExpiredToken()
    만료된 토큰을 생성한 후, isTokenExpired() 검증
    Clock Skew 설정으로 만료 판별 문제 해결

JWT Claims(사용자 정보) 추출

  • testExtractClaims()
    → 토큰에서 사용자 정보가 정상적으로 추출되는지 확인

🔹 AuthControllerTest (JWT 인증 API 테스트)

회원가입 기능 테스트

  • testRegisterUser()
    → 신규 사용자 회원가입 후, "회원가입이 완료되었습니다." 응답 확인

로그인 후 JWT 토큰 반환 테스트

  • testLogin()
    → 로그인 후 응답에서 "token" 필드가 존재하는지 확인
    실제 JWT 토큰이 발급되는지 체크

보안 문제 해결 및 MockBean 충돌 방지

  • @WithMockUser 사용하여 Security 인증 우회
  • @Transactional 추가하여 테스트 데이터 롤백
  • @BeforeEach에서 사용자 미리 등록 → 회원가입 없이 로그인 테스트 가능