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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions