Spring Security : 익명 사용자 필터

    이 글은 인프런 정수원님의 강의를 듣고 복습하며 작성한 글입니다.

    익명 사용자 필터(AnonymousAuthFilter)

    익명 사용자 필터는 인증받지 않은 사용자를 위해 제공되는 필터다. 예를 들어 인증을 받지 않는 사용자가 있다고 가정해보자. 그러면 이 사람은 인증 객체를 가지고 있지 않기 때문에 인증 객체가 있냐고 물어보면 항상 Null이라는 값을 보여줄 것이다. 

    그런데 이렇게 될 경우 Null Pointer Exception이 발생할 수 있다. 따라서 스프링 시큐리티는 인증되지 않은 사용자에게도 익명 인증 객체를 전달하면서 "인증 객체로 증명한다"라는 방식을 유지하려고 한다. 사실, 익명 인증객체라고 해서 뭔가 기능이 추가되지는 않는다. 익명 인증 객체는 어디에도 갈 수 없는 통행증을 얻은 것이나 다름 없다. 

     

    AnonymousAuthenticationFilter 

    익명 인증 필터는 다음과 같이 동작한다.

    1. 요청이 왔을 때, 인증 객체가 있는지 확인한다. 인증 객체가 있다면, 인증받은 사용자기 때문에 다음 필터로 넘어간다. 
    2. 인증 객체가 없다면, 이 사용자는 익명 사용자다. 인증 방식을 통일하기 위해 인증 객체를 생성한다. 그리고 생성된 인증 객체를 Security Context에 넣어준다. 그리로 다음 필터로 넘어간다. 

    익명사용자는 Authentication 이 null 이 아니고 문자열의 "anonymousUser" 이 저장되어 있는 principal과 ROLE_ANONYMOUS 권한 정보를 가지고 있는 객체입니다. 

     

    인증 객체? 익명 객체?

    앞서 이야기한 것처럼 익명인증객체가 만들어진다고 하더라도 아무 소용이 없다. 왜냐하면 통행할 수 있는 곳이 아무곳도 없는 통행증이기 때문이다. Spring Security는 중요한 자원에 접근할 때 마다 인증이 되었는지를 확인하는데 이 때 isAnonymous(), isAuthenticate() 등을 이용해 계속 검사를 한다.

    당연한 이야기지만 익명 객체인 경우 최종적으로는 접근을 하지 못하게 된다. 

     

    익명 객체는 세션에 저장하지 않는다.

    말 그대로 익명 객체는 쓰레드 로컬에 있는 Security Context에만 저장하고 세션에는 저장하지 않는다. 

     

    클래스 보기

    AnonymousAuthFilter

    익명 필터로 들어온다. 이 때, Security Context에 인증 객체가 있는지를 확인해본다. 인증 객체가 없는 경우 createAuth를 통해서 '익명 인증 객체'를 만들고 SecurityContext에 저장한다. 그리고 다음 필터로 넘어간다. 

    AbstractSecurityinterceptor

    스프링 시큐리티의 마지막 인증 인터셉터로 넘어오게 되는데, 여기서 accessDecisionManager가 실제로 인가처리를 해준다. 그런데 이 때, 익명 인증 객체인 경우 Exception이 발생한다. 

    ExceptionTranslationFilter

    Exception이 발생할 경우 ExceptionTranslationFilter로 넘어오게 되는데, 여기서 isAnonymous 등으로 실제로 익명인증 객체인지를 한번 더 확인을 해서 처리를 해준다. 

     

    정리

    • 익명인증필터는 인증받지 않은 사용자에게 익명 인증 객체를 만들어 전달해준다.
    • 익명 인증 객체는 스프링 시큐리티에서 사용상 편의를 위해 만들어주는 것이다.
    • 신분증은 발급받지만 아무 곳도 갈 수 없는 신분증이고, Null로 봐도 무방하다. 

    댓글

    Designed by JB FACTORY