Spring-Security

anonymous()

neal89 2025. 5. 23. 22:20

✅ Spring Security에서 익명 사용자(Anonymous User)의 역할과 동작 원리

Spring Security에서는 인증(Authentication)되지 않은 사용자도 애플리케이션에 접근할 수 있도록 익명 사용자(Anonymous User) 기능을 제공합니다. 이 글에서는 익명 사용자의 개념, 이를 처리하는 필터(AnonymousAuthenticationFilter), 그리고 실제 보안 컨텍스트에 어떤 방식으로 작동하는지까지 자세히 알아봅니다.


🔍 익명 사용자란?

📌 정의

  • 익명 사용자명시적인 로그인 절차 없이 시스템에 접근하는 사용자입니다.
  • 인증된 사용자는 아니지만, Spring Security는 이들에게도 기본적인 Authentication 객체를 생성해 보안 컨텍스트를 유지합니다.

📌 예시

  • 로그인 없이 접근 가능한 홈페이지
  • 비회원도 열람 가능한 게시판
  • 공지사항, 이벤트 페이지 등

🎯 익명 사용자 기능의 목적

목적 설명

✅ 보안 일관성 유지 인증되지 않았더라도 SecurityContextHolder에 Authentication이 항상 존재하게 만듦
✅ 최소 권한 부여 ROLE_ANONYMOUS를 부여하여 접근 제어 로직에 참여
✅ 공통 처리 용이 로그인 여부와 관계없이 일관된 방식으로 사용자 처리 가능

⚙️ 익명 사용자 처리 과정

Spring Security에서는 AnonymousAuthenticationFilter를 통해 아래와 같은 과정을 거쳐 익명 사용자를 처리합니다.

1. 요청 수신

  • 사용자가 웹 애플리케이션에 요청을 보냅니다.
  • 요청은 Spring Security의 필터 체인(SecurityFilterChain)을 통해 처리됩니다.

2. Authentication 확인

  • AnonymousAuthenticationFilter는 현재 SecurityContextHolder.getContext().getAuthentication()이 null인지 확인합니다.
  • 인증 객체가 없다면 아직 인증되지 않은 상태라고 판단합니다.

3. 익명 토큰 생성

  • AnonymousAuthenticationToken 객체를 생성합니다.
  • 기본 구성:
    • principal: "anonymousUser"
    • authorities: [ROLE_ANONYMOUS]

4. 보안 컨텍스트에 설정

  • SecurityContextHolder.getContext().setAuthentication()을 통해 Authentication을 설정합니다.
  • 이제 이후의 필터, 컨트롤러, 보안 검사 로직에서도 익명 사용자 정보에 접근할 수 있습니다.

5. 다음 필터로 전달

  • chain.doFilter()를 통해 다음 필터 또는 컨트롤러로 요청을 넘깁니다.

📌 실전 예시: 사용자 이름 출력하기

@GetMapping("/userinfo")
public String getUsername(@AuthenticationPrincipal Object principal, Authentication authentication) {
    if (authentication instanceof AnonymousAuthenticationToken) {
        return "anonymous";
    }
    return authentication.getName(); // 로그인된 사용자 이름
}

🔒 AnonymousAuthenticationFilter 커스터마이징 (고급)

SecurityFilterChain을 구성할 때 AnonymousAuthenticationFilter를 다음과 같이 직접 설정할 수 있습니다:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .anonymous(anonymous -> anonymous
            .principal("guestUser")
            .authorities("ROLE_GUEST")
        );
    return http.build();
}

🧠 정리

 

항목 설명
필터 AnonymousAuthenticationFilter
토큰 객체 AnonymousAuthenticationToken
principal "anonymousUser" (기본값)
권한 ROLE_ANONYMOUS
설정 위치 SecurityContextHolder
실행 조건 인증되지 않은 요청(Authentication == null)일 경우