[Security] `@WithAnonymousUser` 의 역할

@WithAnonymousUser

  • Spring Security 의 테스트에서 사용된다.
    • 테스트 중인 해당 메서드가 익명 사용자 즉, 인증되지 않은 사용자로 접근한 경우를 테스트하고 싶은 경우 사용할 수 있다.
@Test
@DisplayName("인증되지 않은 사용자가 보호된 경로에 접근하는 경우 401 Unauthorized 응답을 받는다.")
@WithAnonymousUser
public void When_UnauthorizedUserAccessProtectedPath_Expect401() throws Exception {
    //when
    this.mockMvc.perform(get("/v1/api/cart/add"))
            .andExpect(status().isUnauthorized());
}
  • 내부소스
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@WithSecurityContext(
    factory = WithAnonymousUserSecurityContextFactory.class
)
public @interface WithAnonymousUser {
    @AliasFor(
        annotation = WithSecurityContext.class
    )
    TestExecutionEvent setupBefore() default TestExecutionEvent.TEST_METHOD;
}
  • SecurityContext 안에 WithAnonymousUserSecurityContextFactory 를 주목하자
final class WithAnonymousUserSecurityContextFactory implements WithSecurityContextFactory<WithAnonymousUser> {
    WithAnonymousUserSecurityContextFactory() {
    }

    public SecurityContext createSecurityContext(WithAnonymousUser withUser) {
        List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(new String[]{"ROLE_ANONYMOUS"});
        Authentication authentication = new AnonymousAuthenticationToken("key", "anonymous", authorities);
        SecurityContext context = SecurityContextHolder.createEmptyContext();
        context.setAuthentication(authentication);
        return context;
    }
}
  • 실제 인증받지 않은 사용자는 아니긴하다.
    • 정확하게 말하면 익명의 권한을 가진, 로그인되지 않은 사용자를 의미하는데..
    • 내부적으로 시큐리티 컨텍스트를 비우고, AnonymousAuthenticationToken 에서 익명의 이름, 권한을 채운 토큰값을 컨텍스트에 세팅해준다.

익명사용자

  • 기본적으로 인증받지 않은 사용자는 시큐리티에서 ROLE_ANONYMOUS 의 역할을 가진다.

즉,

해당 WithAnonymousUser 는 사용자가 없다는 것은 아니고 user ==null X

익명의 사용자가 특정 리소스에 접근하려고 시도하는 테스트 케이스라고 볼 수 있다.

내 시큐리티 소스상

.authorizeHttpRequests((authorize) -> authorize
                        .anyRequest().authenticated() // 모든 요청에 대해 인증을 받도록 설정
                )
  • 일단 모든 요청에 대해 인증을 받도록 설정했기에
    • @WithAnonymousUser 를 설정한 테스트에서
    • 무조건 HttpStatus.UNAUTHORIZED 이 발생하게 될 것이다.


Uploaded by N2T