본문 바로가기

programming/java, spring

Spring Security 인증 내부를 파헤쳐보자

Spring Security에서는 별도의 설정이 없다면 세션을 이용하여 처리한다. , 사용자가 로그인을 하면 서버는 해당 사용자의 세션을 만들고, 서버의 메모리와 데이터베이스에 저장한다

Redis를 도입하여 세션을 관리하기로 결정하고, Spring Security 내부에서 어떻게 세션정보를 담고 있는지 궁금해졌다.

 

SecurityContextHolder 구조

 

SecurityContext 객체를 저장하고 감싸고 있는 wrapper 클래스인 SecurityContextHolder가 있고, Authentication 객체가 저장되는 보관소인 SecurityContext가 있다. 사용자의 세션 정보는 이 Authentication 객체 안에 담겨있다.

 

눈으로 직접 확인해보기 위해 코드로 살펴보자.

 

 

ecurityContextHolder에서 Authentication 객체를 꺼낸 다음, WebAuthenticationDetails로 캐스팅 해준다.

WebAuthenticationDetails 내부에는 세션ID를 필드로 가지고 있고, 세션ID를 리턴하는 메소드가 존재한다.

 

 

컨트롤러에서 세션ID를 프린트하는 로직을 추가했다.

 

세션ID

 

실제로 이 ID가 맞는지 브라우저에서 개발자도구를 통해 확인해보았다.

 

 

request 헤더부분 쿠키에 JSESSIONID로 정보를 담아 전송하는 것을 볼 수 있다.