카테고리 없음

TIL(2025-05-13)

dydwo6018 2025. 5. 13. 23:58

◆ JWT 기반 인증/인가 시스템 구현 (feat. 공통 예외처리) ◆
오늘은 인턴 과제의 요구사항에 맞춰 다음 두 가지 기능을 구현하였다:

  1. 공통 예외 처리 구조 정리
  2. JWT를 이용한 인증/인가 시스템 구축

▶ 먼저 ErrorCode, GlobalExceptionHandler, CustomExcepetion 클래스를 구현하여 통일된 예외 응답 포맷을 적용하였다.

예외 발생 시 아래와 같은 양식이 요구 사항이였기 때문에 같은 형식의 JSON 응답을 내려주는 것이 목표였다. 

{
  "error": {
    "code": "INVALID_CREDENTIALS",
    "message": "아이디 또는 비밀번호가 올바르지 않습니다."
  }
}



▶  다음으로 JWT 기반 인증 시스템을 적용하기 위해
JwtUtil 클래스를 생성하고, 토큰 발급 및 검증 로직을 구성하였다.
이때 사용할 **시크릿 키(secret key)**는 application.yml에 임의 문자열로 설정해 개발 환경에서 우선 테스트하였다.

jwt:
  secret: my-super-secret-key-that-is-very-long


★ JwtUtil 기능 정리 ★
→  JWT 관련 기능을 전담하는 유틸리티 클래스로, 다음과 같은 주요 역할을 수행한다.

# JwtUtil의 핵심 기능

1. Access Token 생성
→  사용자 ID를 기반으로 JWT 토큰을 생성하여, 로그인 성공 시 클라이언트에게 전달한다

String token = jwtUtil.createAccessToken(userId);


2. 토큰 유효성 검증
→ 클라이언트가 보낸 토큰이 변조되었거나 만료되지 않았는지 확인한다.

boolean isValid = jwtUtil.validateToken(token);

3. 토큰에서 사용자 정보 추출

→ 토큰에서 사용자 식별자(userId)를 추출하여 인증 처리에 사용한다.

UUID userId = jwtUtil.getUserIdFromToken(token);


이 클래스를 통해 토큰 생성부터 검증, 파싱까지 모든 JWT 로직을 하나의 책임으로 관리할 수 있다.
추후 JwtAuthenticationFilter에서 이 유틸을 사용하여 요청마다 토큰을 검사하게 된다.


역할 기반 인가 처리를 위한 필터 리팩토링

요구사항 중 다음과 같은 조건이 있었다:
"역할(Role) 기반 접근 제어를 적용하여 관리자(Admin) 권한이 필요한 API를 보호합니다."

이를 충족하기 위해서는 단순한 인증뿐 아니라 권한(Role)에 따른 인가 처리 로직이 필터에 필요하다고 판단하였다.

초기에는 단순히 사용자가 로그인 상태인지 확인하는 로직만 구현하였으나,
관리자만 접근 가능한 API를 추가하려는 순간 Role 기반 인가가 필수라는 점을 체감하게 되었다.

따라서 JWT 필터(JwtAuthenticationFilter) 내부에서

  • 토큰에서 추출한 userId를 기반으로
  • 사용자 정보를 조회하고
  • User가 가진 roles를 GrantedAuthority로 변환하여
  • Spring Security의 인가 시스템과 연동할 수 있도록 리팩토링을 진행하였다.

아직 인증/인가 시스템이 익숙하지 않아,
처음에는 최대한 단순한 구조로 구현하고, 이후 점진적으로 리팩토링하는 방식을 택했다.
이러한 접근 방식이 현재 나에게 가장 잘 맞는 학습 방식이라고 느끼며 구현을 진행하고 있다.


느낀점

이번 구현을 통해 JWT 기반 인증 및 역할 기반 인가 시스템의 전체적인 구조와 흐름을 많이 이해할 수 있었다.
특히, 인증과 인가의 차이를 직접 체감하면서 보안 로직을 세밀하게 다뤄야 하는 이유도 명확해졌다.

내일은 현재 작성한 토큰에서 권한 정보를 직접 꺼내는 방식으로 JwtAuthenticationFilter를 리팩토링하고,
실제 Postman 테스트를 통해 관리자 권한이 필요한 API가 정상적으로 보호되는지를 검증할 예정이다.

단순히 "동작하게 만드는 것"을 넘어, 보안성과 유지보수성을 고려한 설계로 나아가는 경험이 되기를 기대한다.
꾸준히 개선하고 기록하며 성장해야겠다.