Skip to content

JWT 인증 필터의 중복 User 조회 제거 및 요청당 DB 쿼리 수 개선 #325

Description

@jjoonleo

배경

현재 JWT 인증 경로에서 access token 검증과 Spring Security authentication 저장 과정이 각각 User를 조회합니다.

  • JwtTokenProvider.isAccessTokenValid(...)에서 token signature/claim 검증 후 User를 조회하고, 저장된 access token과 비교합니다.
  • 이후 JwtAuthenticationFilter.checkAccessTokenAndAuthentication(...)에서 access token에서 userId를 다시 추출하고 User를 다시 조회해 authentication을 저장합니다.

이 구조는 인증된 API 요청마다 DB 조회가 중복되어, 트래픽 증가 시 요청 latency와 DB 부하에 직접 영향을 줄 수 있습니다.

측정 지표

  • 인증 요청 1건당 DB query 수
  • 인증 요청 p50/p95 latency
  • JwtAuthenticationFilter 처리 시간
  • 동일 access token 요청 반복 시 DB read QPS

개선 방향

  • access token 검증과 authentication 저장에서 User 조회를 한 번만 수행하도록 인증 흐름을 정리한다.
  • Active Session 검증 책임을 한 module/seam에 모은다.
  • JwtTokenProvider가 HTTP/Spring Security authentication 저장까지 알지 않도록 역할을 줄인다.
  • 컨트롤러에서 HttpServletRequest를 통해 userId를 재파싱하는 흐름을 점진적으로 줄일 수 있는지 검토한다.
  • 기존 단일 Active Session 정책은 유지한다.

완료 조건

  • 개선 전 인증 요청 1건당 DB query 수를 측정한다.
  • 개선 전 인증 요청 p50/p95 latency를 측정한다.
  • access token 인증 성공 경로에서 User 조회가 2회에서 1회로 줄었음을 테스트 또는 계측으로 확인한다.
  • invalid/expired/replaced access token 응답 동작이 기존과 호환된다.
  • refresh token 재발급 경로가 기존과 호환된다.
  • ./gradlew check가 통과한다.

참고 코드

  • ontime-back/src/main/java/devkor/ontime_back/global/jwt/JwtAuthenticationFilter.java
  • ontime-back/src/main/java/devkor/ontime_back/global/jwt/JwtTokenProvider.java
  • ontime-back/src/main/java/devkor/ontime_back/service/AuthTokenService.java

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions