thymeleaf-extras-springsecurity 동작 원리

thymeleaf-extras-springsecurity

게스트 상태에서는 "로그인" 메뉴바,
로그인 상태에서는 "장바구니", "구매내역", "로그아웃" 등의 메뉴바,
관리자 상태에서는 "상품등록", "상품관리" 등의 메뉴바만 출력되게끔 thymeleaf-extras-springsecurity 의 sec:authorize="isAuthenticated()" 와 같은 기능을 사용했지만 정확하게 어떤 원리로 이루어지는지 궁금해서 관련 내용과 디버깅을 통해서 정리해봄




sec:authorize="isAuthenticated()"

Spring Security 를 사용하기 전에는 request.session 객체를 이용하여 직접 로그인한 사용자의 정보를 계속해서 유지함. 하지만 Spring Security 를 사용하면 자동으로 로그인한 사용자의 정보를 유지하고, sec:authorize="isAuthenticated()" 와 같은 방법으로 현재 로그인한 사용자의 권한에 따라 다른 정보를 출력할 수 있음




Spring Security Context

사용자가 로그인 인증에 성공하면 Authentication 이라는 인터페이스 구현체가 만들어짐 (실제 사용되는 객체는 UsernamePasswordAuthenticationToken). 이 객체 안에는 현재 로그인한 사용자의 정보를 담고있는 Principal(User 객체), Credentials(PW), Authorities(Role) 객체가 존재함. 이 Authentication 객체를 담고 있는 것이 Security Context 이고, 또한 이를 담고 있는 것이 SecurityContextHolder




동작 원리

sec:authorize="isAuthenticated()" 의 동작원리는 위에서 살펴본 Spring Security Context 와 연관된 것 같아서 로그인한 사용자가 보내는 Reqeust 문을 테스트 환경에서 확인해봄

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {SPRING_SECURITY_CONTEXT=SecurityContextImpl
                    [Authentication=UsernamePasswordAuthenticationToken 
                    [Principal=org.springframework.security.core.userdetails.User
                    [Username=admin, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, credentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[ROLE_ADMIN]], 
                    Credentials=[PROTECTED], Authenticated=true, Details=null, 
                    Granted Authorities=[ROLE_ADMIN]]]}

Session Attrs 에 Security Context 가 보내지는 것을 확인할 수 있었음. 즉, 로그인한 사용자가 요청을 보내면 해당 사용자의 Session 에 로그인한 사용자의 정보가 담긴 Security Context 가 담겨지고, 여기서 Authenticated=true, Authorities=[ROLE_ADMIN] 등의 정보를 이용하여 sec:authorize="isAuthenticated()" 기능이 동작하는 것 같음

좋은 웹페이지 즐겨찾기