Spring Boot 오류 개선 1. 인증 로직 수정

최민길(Gale)·2023년 7월 16일
1

Spring Boot 적용기

목록 보기
37/46

안녕하세요 오늘은 Spring Security 적용 시 인증이 제대로 이루어지지 않았던 오류에 대해서 수정하는 작업을 진행하려고 합니다.

발생한 이슈에 대해 설명드리겠습니다. Spring Security를 적용한 상태로 테스트 환경에서는 정상적으로 동작하였으나 실제 배포 환경에서 Header 검증이 필요한 API에서 AuthenticationException을 던졌습니다.

우선 Spring Security의 동작 방식에 대해서 간단하게 알아보겠습니다. (자세한 내용은 하단의 링크 참조) Spring Security에서 인증 정보는 Authentication - SecurityContext - SecurityContextHolder의 순서로 저장됩니다. 저장된 인증 정보로 인증하기 위해서 Spring은 SecurityContextHolder에 요청된 값으로 생성된 Authentication이 저장된 SecurityContext 내의 Authentication과 일치하는지를 검증합니다.
링크 : https://velog.io/@gale4739/Spring-Boot-%EC%9D%B8%EC%A6%9D%EC%9D%B8%EA%B0%80-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B3%A0%EB%8F%84%ED%99%94-%EC%9E%91%EC%97%85

여기서 SecurityContextHolder에 인증 정보를 저장하는 과정에서 오류가 발생했습니다. 인터셉터에서 비즈니스 로직을 처리하면서 인터셉터 검증이 끝난 후 SecurityContextHolder에 저장하는 로직으로 진행하였는데 그러다보니 필터 레벨에서 검증 시 SecurityContextHolder에 인증 정보가 없어 예외를 리턴하였습니다. 이를 해결하기 위해 필터 레벨에서 SecurityContextHolder에 인증 정보를 추가하니 정상적으로 작동하였습니다.

이 과정에서 두 가지 깨달은 사실이 있습니다.

  1. UsernamePasswordAuthenticationFilter는 SecurityContextHolder에 인증 정보가 저장되어 있어야 검증이 가능하다.
  2. MockMvc 환경에서 UsernamePasswordAuthenticationFilter는 적용되지 않는다.

1번의 경우 위에서 알아본 내용으로, 2번은 이번에 새롭게 안 사실입니다. 사실 필터는 Spring 서비스 바깥에서 동작하기 때문에 MockMvc에서 필터를 추가해주어야한다는 것을 유추할 수 있었으니 이렇게 직접적으로 알게 된 것은 처음입니다. 따라서 다음 시간에는 테스트 환경에서 UsernamePasswordAuthenticationFilter를 검증하도록 테스트 환경을 수정하는 작업을 진행하겠습니다.

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글