TIL

Spring Security6를 활용한 인증 인가

DongHo 2024. 12. 27. 19:30

문제 정의

기존 인증 방식(세션)의 문제점은 서버가 상태를 유지해야 하며, 세션 데이터를 관리하는 데 많은 자원을 소모하여, Spring Security 6과 JWT 방식을 사용하여 확장성 있고 안전한 인증/인가 시스템을 구축하고자 했습니다.

 

선택 가능한 기술 분석

항목 세션 기반 인증 JWT 기반 인증
상태 관리 서버에서 상태 관리(Stateful) 클라이언트에서 상태 관리(Stateless)
확장성 서버와 세션 간의 동기화 필요 서버에 상태 저장 X
보안 세션 ID 탈취 시 하이재킹 위험, 세션 고정 공격 위험 토큰 탈취 시 위험
성능 서버가 세션 정보를 관리하므로 부하 발생 가능 서버 부하 LOW, 대규모 트래픽 처리에 유리
유지 관리 서버가 세션 정보를 저장하므로 서버가 다운되면 세션 손실 서버가 상태를 저장하지 않으므로 서버 다운 시 영향 X

 


기술 선택 및 구현

위의 표와 같은 이유로 세션 기반 인증 방식을 사용하기 보다 대규모 트랙픽에 유리한 JWT 기반 인증 방식을 사용하여 구현하게 되었습니다.

[필터 구조]

Spring Security의 OncePerRequestFilter를 기반으로 총 3개의 필터를 구현했습니다.

 

1. JWTTokenGeneratorFilter(JWT 생성 필터)

사용자가 로그인 성공 시 JWT를 생성하고, 이를 클라이언트에게 반환하는 역할을 합니다. 또한, JWT에 사용자 정보를 Claims에 저장했습니다.

주요 동작 방식

  1. 로그인 요청 처리: 사용자가 로그인 요청을 보내면, JWTTokenGeneratorFilter에서 인증이 성공한 사용자 정보를 기반으로 JWT를 생성
  2. JWT 반환: 생성된 JWT는 응답 헤더에 담겨 클라이언트로 반환
  3. JWT 검증: 이후 클라이언트가 API 요청을 보낼 때, JWTTokenValidatorFilter가 토큰을 검증합니다. 검증된 사용자 정보는 SecurityContextHolder에 저장
  4. 사용자 정보 파싱: 추가적으로, TokenFilter는 JWT의 Claims를 파싱하여 사용자 정보를 추출하고 이를 HttpServletRequest 에 저장

 

2. JWTTokenValidationFilter(JWT 검증 필터)

클라이언트 요청 헤더에서 JWT를 파싱하고, 사용자 정보를 검증한 후 SecurityContextHolder에 저장

주요 동작 방식

  1. JWT 파싱 및 검증: JWTTokenValidationFilter는 JWT의 서명을 검증하고, Claims에서 사용자 정보를 추출
  2. ROLE 기반 검증: JWT Claims에서 권한 정보를 검증

 

3. TokenFilter

JWT에서 사용자 정보를 파싱해 HttpServletRequest에 저장합니다. 이를 통해 컨트롤러에서 사용자 정보를 활용 가능

주요 동작 방식

  1. Claims 파싱: JWT의 Claims에서 사용자 ID와 역할 정보를 추출
  2. Request 속성 저장: 추출된 사용자 정보를 HttpServletRequest의 Attribute로 저장하여, 이후 요청 처리에 활용

 


설계 및 구현 특징

  • Spring Security 필터링 시스템을 활용해 커스텀 필터 개발 및 JWT 기반 보안 구조 설계
  • Stateful vs Stateless 인증 방식의 차이점을 학습하고 확장성 있는 보안 시스템 도입
  • JWT 구조 및 Claims 활용을 통해 사용자 정보 관리 및 보안 강화

 

향후 계획

  • Principal 객체 활용
    • SecurityContextHolder에서 Authentication 객체를 통해 사용자의 정보를 관리하고, Principal 객체를 활용하여 인증된 사용자 정보를 더 쉽게 접근할 수 있도록 할 예정
  • JWT 보안 개선
    • Refresh Token 전략 도입으로 만료된 Access Token을 재발급함으로써 로그인을 유지하고, 사용자 경험을 개선하고 보안을 강화할 계획
  • 회원 정보 암호화 저장
    • 회원 정보를 RSA와 같은 비대칭 알고리즘을 사용하여 암호화하고, 이를 DB에 안전하게 저장할 계획
  • 로그 저장 시스템
    • Logstash와 연동하여 서버 로그를 Elasticsearch로 저장
    • Kibana를 활용한 실시간 모니터링 환경 구축

 

소감

JWT 기반 인증 시스템을 처음 구현하면서 JWT 필터 구조에 대한 이해가 어려웠습니다. 이를 해결하기 위해 JWT 인증 시스템의 흐름을 구조적으로 분석하고, Spring Security 필터의 역할을 명확히 이해하는 데 집중했습니다. 또한, 시스템 로그를 통해 필터의 동작을 추적하며, JWT 검증 과정과 사용자 인증 흐름을 세밀하게 파악했습니다. 이러한 경험을 통해, 저는 문제 해결을 넘어 기술적 원리를 이해하고 이를 체계적으로 적용하는 능력을 키웠으며, 새로운 기술을 빠르게 습득하고 실전에 적용하는 적응력도 키울 수 있었습니다.

 

코드

 

GitHub - Bang1999/WeShareU: 외국인을 위한 여행 공유 플랫폼 WSU

외국인을 위한 여행 공유 플랫폼 WSU. Contribute to Bang1999/WeShareU development by creating an account on GitHub.

github.com