작성
·
657
1
안녕하세요 선생님 질문이 있습니다.
다른 질문들을 읽어보니
인증관련 관계도를 보면 이렇습니다.
Session > SecurityContext > Authentication > UserDetials 입니다.
+ 그리고 스프링 시큐리티에서 SecurityContext 에 인증객체를 저장하는 것은 세션과는 아무런 상관이 없습니다.
SecurityContextHolder > ThreadLocal > SecurityContext > Authentication > UserDetails
이러한 관계도를 가진다고 말씀해주셔서 디버깅 해보니
인증을 성공한 시점에 request.getSession에서 attribute로 SecurityContextImpl 을 들고 있다는것을 확인하였습니다.
궁금한 것은 spring security에서 SecurityContext에 인증객체를 저장하는것은 세션과 아무런 상관이 없다는것이
session은 attributes에 들고 있고
SecurityContextHolder는 threadlocal에 들고 있으니
그냥 각각 다른 저장소에 같은것을 저장할 뿐이다. 그래서 아무런 상관이 없다.
라고 이해하면 맞을까요?
답변 1
3
아주 넓은 의미에서 보면 세션과 전혀 상관이 없다고 할 수는 없습니다.
일단 SecurityContext 객체도 세션에 저장되기 때문입니다.
다만 스프링 시큐리티에서는 해당 사용자가 인증이 되었는지 아닌지를 판별할 때 세션을 직접 참조하는 것이 아닌 ThreadLocal 에 저장된 SecurityContext 객체를 꺼내어 이 속에 Authentication 객체가 존재하는지 여부를 보기 때문에 세션과는 직접적인 상관이 없다고 설명한 것으로 이해하시면 되겠습니다.
그리고 스프링 시큐리티에서는 세션을 아예 사용하지 않고도 인증을 구현하는 일종의 토큰 방식을 사용할 수도 있기 때문에 세션에 의존적이지 않습니다. 하지만 이 때에도 SecurityContext 객체는 여전히 인증여부를 판단하는 객체이기 때문에 세션보다는 SecurityContext 객체가 좀 더 비중이 있는 것이고 시큐리티는 이 객체안에 Authentication 가 존재하는지를 항상 체크하고 있습니다.