익명사용자

Spring Security 에서는 인증되지 않은 사용자를 익명으로 인증된 사용자로 명명한다. 그 이유 중 하나는 액세스 제어 속성을 구성하는 더 편리하기 때문.

이것도 첫 번째 맥락과 유사한데, Spring Security 에서는 인증받은 사용자가 있는데 인증 사용자와 구분할 수 있는 익명 사용자를 두고 있다. 우리가 익명 사용자라고 하면 인증을 받지 못했으니 아무런 실체가 없는 것(서버에 접속하는 아무나)으로 해석하기 쉽지만 Spring Security 에서는 인증받은 사용자와 인증 받지 않은 사용자를 동일한 기준에서 구분하고 싶어한다. 어떠한 자원이 있는데, 클라이언트에서 서버에 접속 시 이게 익명의 사용자인지 인증 받은 사용자인지 구분의 기준이 동일하게 객체로 구분하고자 한다. 따라서 인증받은 사용자면 인증 받은 사용자로, 인증 받지 못한 사용자면 인증 받지 못한 사용자로 클래스화, 객체화해 구분 하려는 것.

SecurityContextHolder 안에는 SecurityContext 가 있고 여기에는 인증을 받았을 경우 Authentication 이라는 객체를 저장한다. 그 이유는 인증 상태를 유지하고 인증 받은 사용자는 다시 기본적으로 HttpSession 에 저장한다고 했다. 이게 인증 받은 사용자의 인증 상태를 유지하는 방법.

그런데 인증 받지 못한 사용자도 똑같다. 즉, 익명 사용자도 SecurityContext 에 저장하겠다는 것. 차이점은 익명 사용자는 세션에는 사용하지 않겠다는 것.

동일하게 클래스, 객체 선상에서 두 개를 바라보고 구분할 수 있으므로 굉장히 유용하다. 하지만 세션은 인증된 사용자의 인증 상태를 계속 유지하기 위함이므로 익명 사용자는 인증 받지 못한 상태를 계속 유지해야할 필요가 없기에 세션은 사용하지 않는다.

정상적으로 로그인해 인증을 받았다면 우리는 DB에서 정보를 가져와 User 객체를 하나 얻는다. 그리고 이걸 보통 Session 에 저장한다. 그리고 다시 어떤 사용자가 서버에 접속한다면 그 서버는 현재 사용자가 인증을 받았는지 받지 못했는지를 세션으로부터 가져온다. 이 User 객체가 만약 null이라면 인증 받지 못했다 판단하고 처리한다. 따라서 보통 null 인지 아닌지를 판단해 사용한다.

그런데 Spring Security 에서는 null의 개념을 없애고 인증을 받지 못했더라도 별도의 인증받지 못한 사용자의 개념을 둔 클래스나 객체를 두어 구분하고자 한다.

그래서 익명 인증 사용자의 권한을 별도로 운용할 수 있다. 즉, 인증된 사용자가 접근할 수 없도록 구성이 가능하다.

익명사용자 API 및 구조

스크린샷 2025-02-02 오후 4.58.19.png

살펴보면 anonymous 라고 있다. 이게 익명 사용자의 어떠한 설정을 할 수 있는데, 보통은 거의 건들 필요 없이 default 로 설정해도 크게 상관이 없다.

몇 개의 설정을 할 수 있는데, 익명 사용자도 이름이 있고 그 이름을 변경할 수 있다. Principle API 를 통해 바꿀 수 있고 익명 사용자도 권한을 갖고 있다. 그 권한도 이름 변경 가능. 이렇게 설정 해 익명 사용자도 나름 커스터마이징 가능.

구조를 살펴보면 익명 인증 필터 (AnonymousAuthenticationFilter)가 있다. 이 필터에서 현재 접속한 사용자가 인증받지 못했다면 이 필터에서 익명 사용자의 인증 객체를 생성하고 SecurityContext 안에 저장하는 역할을 이 필터가 하는 것.

그래서 AnonymousAuthenticationToken 이라는 익명 사용자용 토큰 객체를 만들고 여기에는 기본적으로 anonymousUser 문자열의 이름이 들어간다. 이게 .principle 에 담기는 것. 그리고 ROLE_ANONYMOUS 권한도 .authorities 에 기본적으로 담긴다. 이렇게 default 로 되어있고 위에서와 같이 이 값을 수정할 수 있다.