Spring Security에서는 별도의 설정이 없다면 세션을 이용하여 처리한다. 즉, 사용자가 로그인을 하면 서버는 해당 사용자의 세션을 만들고, 서버의 메모리와 데이터베이스에 저장한다.
Redis를 도입하여 세션을 관리하기로 결정하고, Spring Security 내부에서 어떻게 세션정보를 담고 있는지 궁금해졌다.
SecurityContext 객체를 저장하고 감싸고 있는 wrapper 클래스인 SecurityContextHolder가 있고, Authentication 객체가 저장되는 보관소인 SecurityContext가 있다. 사용자의 세션 정보는 이 Authentication 객체 안에 담겨있다.
눈으로 직접 확인해보기 위해 코드로 살펴보자.
ecurityContextHolder에서 Authentication 객체를 꺼낸 다음, WebAuthenticationDetails로 캐스팅 해준다.
WebAuthenticationDetails 내부에는 세션ID를 필드로 가지고 있고, 세션ID를 리턴하는 메소드가 존재한다.
컨트롤러에서 세션ID를 프린트하는 로직을 추가했다.
실제로 이 ID가 맞는지 브라우저에서 개발자도구를 통해 확인해보았다.
request 헤더부분 쿠키에 JSESSIONID로 정보를 담아 전송하는 것을 볼 수 있다.
'programming > java, spring' 카테고리의 다른 글
트랜잭션 격리수준과 JPA 낙관적 락을 통한 동시성 제어 (1) | 2023.03.11 |
---|---|
Hibernate 내부 클래스 PersistentBag (1) | 2023.03.03 |
jacoco를 적용해 테스트 커버리지를 높여보자 (0) | 2023.02.22 |
Mockito로 테스트코드 작성하기 (2) | 2023.02.07 |
JPA Entity가 기본 생성자를 가져야 하는 이유 (정적 팩토리 메소드) (1) | 2022.08.12 |