Spring Security 인증 어노테이션들 feat.TDD

Panda·2022년 4월 9일
0

Spring

목록 보기
21/44

TDD를 작업하는 도중에 사용자 인증 즉 Spring Security 인증이 있어야
서비스를 진행할 수있는 Controller가 있습니다.

이때 이러한 테스트들을 진행할때마다 사용자 로그인하고 헤더에 Access Token 값을 붙여주거나 혹은 Security Context에 인증을 설정해주던가 둘중 하나로 하면 되긴 되는데
좀더 심플한 방법을 찾아가지고 공부를 하였습니다.

WithMockUser

UserDetails를 생성해주는 어노테이션인데요

@WithMockUser(username = "username", password = "password", roles = {"USER","ADMIN"})
@Test
public void postCreate() throws Exception {
     ...
}

사용법은 해당 Test가 진행되는 메소드에 어노테이션을 달면 되는데
이때 username, password, roles 를 설정할수 있습니다.

이렇게만 하면 따로 인증 작업을 걸칠 필요없이 바로 인증이 된 상태로 접근하기 때문에
완전 편합니다.

참고로 WithMockUser 어노테이션을 Custom 해서 사용할 수 있는데
이것은 여기를 참고하면 될 것 같습니다.

WithAnonymousUser

익명의 유저로 인증을 합니다.

@WithAnonymousUser
@Test
public void postGet() throws Exception {
	...
}

이건 보통 비로그인 시 인데 인증이 필요하는 서비스를 테스트할때 붙이게 됩니다.

제가 이걸 사용하면서 알게 된건데
실제 어플리케이션을 실행을 하여 비로그인한 상태(Access Token 전달 안해주거나 잘못된 경우)에서 Spring Security에 접근을 하게 되면 principal이 anonymousUser 설정되어 보입니다.

근데 @WithAnonymousUser 어노테이션이 있는 테스트를 진행하게 되면 Spring Security principal에 anonymous 설정되어 보입니다.
실제 어노테이션 확인해보면 principal의 기본값이 anonymous으로 설정된 것을 확인할수 있습니다.

그래서 이거는 좀 통일안된게 웃기긴 했는데 테스트용, 실제 Production Run 익명 사용자를 따로 구분지어서 동일한 익명 사용자로 판별하는걸 만들어야 될것 같습니다.

WithUserDetails

특정 사용자로 인증

@WithUserDetails(value = "testUser", userDetailsServiceBeanName = "userService")
@Test
public void postCreate() throws Exception {
	...
}

이미 존재하는 사용자를 조회해서 UserDetails를 조회하여 인증을 합니다.

  • value : 사용자 이름
  • userDetailsServiceBeanName: UserDetails 조회 서비스의 빈 이름, 이때 하나밖에 없으면 생략가능 합니다.

특정 사용자 계정으로 인증해서 테스트를 진행하고 싶으면 이 어노테이션을 사용해서 진행하면 될 것 같습니다.

느낀 점

사용자 인증을 매 테스트마다 수작업으로 인증하려고 했지만
이러한 편리한 어노테이션을 알게되어서 정말 다행이라고 생각합니다 ㅋㅋㅋㅋ

너무 편리한거같아요.

profile
실력있는 개발자가 되보자!

0개의 댓글