- JWT Spring-Security-Test로 테스트시 인증정보 주입2021년 07월 22일 23시 16분 53초에 업로드 된 글입니다.작성자: jCurve728x90반응형
스프링 시큐리티를 적용한 토이 프로젝트에서 JWT로 인증,인가 기능을 부여한 컨트롤러를 테스트하는 과정에서 간단하게 Spring-Security-Test에 @WithMockUser를 사용하면 테스트에 필요한 인증된 인증 정보를 제공받을 수 있어서 기본 설정으로 테스트를 진행할 수 있는데
Spring Security는 기본적으로 세션-쿠키 방식이고 내가 진행한 방식은 JWT 방식의 요청을 처리하는 컨트롤러를 테스트해야 해서 DB의 접근이 필요했다.
@WithMockUser는 일반적인 상황의 기본 Principal을 제공하여 Authentication객체가 Security Context에 등록이 되는데 보통 OAuth2처럼 Provider들에 따라 Principal의 구현이 달라지는 상황에서는 개발자가
UserDetailsService를 구현한 custom DetailsService 클래스를 만들텐데 이 클래스를 사용해서 인증 정보를 제공받을 수 있도록 @WithUserDetails라는 애너테이션을 사용했다.
필자의 경우 이 커스텀한 UserDetailsService를 사용할 때 오버라이딩한 메서드를 사용하지 않고 새로운 메서드를 구현해서 사용자의 정보를 DB에서 넘겨 받았는데 @WithUserDetails는 UserDetailsService 추상화에 의존해 실행하기 때문에 loadUserByUsername 메서드를 통해 사용자 정보를 Dao나 Repository에서 받아오는 로직을 실행시키게된다.
이 @WithUserDetails의 실행 시점은 junit의 @Before보다 먼저 실행되기 때문에 필자의 경우 테스트시에 필요한 사용자를 등록하기 위해 @BeforeTransaction을 통해 등록을 시도했으나 이 또한 @WtihUserDetails의 실행이 우선되어 어플리케이션 로딩 시점에 빈이 등록된 후 바로 테스트용 사용자 정보를 입력해주기 위해
@PostConstruct 방식을 선택했다.
인증된 사용자의 요청을 처리하는 컨트롤러에서는 @WithUserDetails로 만들어진 "test@naver.com"을 이름 property로 갖는 UserPrincipal이 확인되어 요청을 받아 사용자의 정보를 반환해주는 테스트를 통과하는 모습을 볼 수 있다.
반응형'Spring' 카테고리의 다른 글
Spring HandleMethodArgumentResolver로 반복적인 Session 연산 처리 (0) 2021.10.08 Spring 로깅 log4j2 (0) 2021.10.07 Jpa Entity 연관관계가 참조되어있는 객체 삭제 (0) 2021.06.15 Jpa Named Query 에러와 @Modifying , @Transactional (0) 2021.06.15 Spring Dto -- Nested Class? (0) 2021.06.04 댓글