Anonymous 라는 이름 굉장히 친숙하다. 익명의 사용자를 뜻하는 Anonymous 를 처리하는 Filter가 있다니 굉장히 놀랍다
익명의 사용자 인증 처리
역시나 생각보다 굉장히 간단한 로직을 타고 있다. 하지만 여긴 중요한 것이 있기 때문에 꼭 알아두어야 할것이다
- 익명 사용자 인증 처리 필터
- 익명 사용자와 인증 사용자를 구분
- 화면에서 인증 여부를 구현할 때 isAnonymuos() 와 isAuthenticated() 로 구분해서 사용한다.
- 인증객체를 세션에 저장하지는 않는다.
우리는 상식적으로 인증을 할 때 과정은 유저가 인증을 하면 세션에 인증된 user객체를 저장하고 해당 사용자가 어딘가에 접근하려고 한다면 해당 세션에서 저장한 객체를 확인해서 이 객체가 null 인지 아닌지 확인해 인증을 판단한다고 지금까지 설명해왔다.
하지만 익명의 사용자 또한 null 값이 아닌것으로 처리할 수 있다. 어떻게 처리가 되는것일까?
- 사용자가 AnonymousAuthenticationFilter 라는 필터에 걸리는 요청을 했다. 그러면 Authentication객체를 통해 사용자를 확인하는데 SecurityContext에 존재한다면 다음 필터로 당연히 넘어갈것이다. 하지만 없다면? AnonymousAuthenticationToken이라는 익명의 인증 객체를 생성한다.
null 로 처리하는 것이 아닌 익명 사용자용 토큰 객체를 만들어 context에 보관하는 것이다
그러면 신기하게도 인증이 된 사용자 처럼 서비스를 이용할 수 있다. - 결국 해당 필터는 익명과 인증 된 사용자인지 판단하는 필터인것이다.
- 해당 필터를 사용하는것은 isAnonymous() 함수와 isAuthenticated() 메소드로 구분을 하는데 이는 로그인과 로그아웃을 구분짓는 역할을 수행할수도 있다.
- isAnonymous의 값이 true가 된다면 익명의 사용자가 되고 로그인이 필요하다! 라는 결론이 나온다
- isAuthenticated의 값이 true이면 인증이 된 객체로써 익명의 사용자만 사용 가능한 페이지를 사용할수 없는것이다.
- 인증 객체를 세션에 저장하지 않는다는것은 임의의 사용자이기 때문이다.
정리
우리가 어떠한 프로젝트를 만들다보면 인증이 필요없는 페이지가 있을테고 꼭 인증을 해야만 하는 페이지가 존재할것이다. 그렇다면 그냥 우리의 사이트를 돌아다니는것이 아닌 익명의 사용자의 권한을 들고 돌아다니는것을 시큐리티는 오히려 추천하게 되는것이다. 그렇다면 화면을 구성할때 훨씬 더 많은 자유도를 둘수 있다.
뭐 예를 들어 내가 익명의 사용자에게 제공되는 페이지와 인증된 사용자에게 제공하는 페이지를 구분하고 싶다면 이런식으로 사용하면 되는것이다.
JWT 토큰으로 시큐리티를 구성할때도 꼭 생각해봐야하는 구성이다!
'Spring > 👨💻 SpringSecurity' 카테고리의 다른 글
ExceptionTranslationFilter 와 RequestCacheAwareFilter (0) | 2023.06.26 |
---|---|
권한 설정 (0) | 2023.06.26 |
RememberMeAuthenticationFilter (0) | 2023.06.26 |
CuncurrentSesseionFilter (0) | 2023.06.26 |
SessionManagementFilter(동시 세션 제어 / 세션 고정 보호 / 세션 정책) (0) | 2023.06.26 |