✅ 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)일 경우 |
'Spring-Security' 카테고리의 다른 글
RequestCache, SavedRequest, RequestCacheAwareFilter (0) | 2025.05.23 |
---|---|
logout() (0) | 2025.05.23 |
rememberMe() 작동 (토큰 생성과 filter 작동은 다르다!) (0) | 2025.05.21 |
rememberMe() / RememberMeAuthenticationFilter (0) | 2025.05.21 |
기본인증 httpBasic() / BasicAuthenticationFilter (0) | 2025.05.21 |