Spring Security에서 위와 같이 동시 로그인을 차단하는 세션 정책을 설정하였으나 적용되지 않는 문제가 발생했다.
문제의 원인을 파악하고자 스프링 시큐리티에서 제공하는 세션 관련 클래스들을 찾아봤다.
그 중 동시 접속과 관련된 세션 처리를 하는 ConcurrentSessionControlAuthenticationStrategy.class 를 발견할 수 있었고
브레이크 포인트를 찍어서 디버깅해보았다.
위 사진에 보면 sessionRegistry.getAllSessions() 메서드를 호출하는데, 인증 객체의 Principal 값을 토대로 그것과 유사한 모든 세션을 조회해오는 메서드이다. 여기서 Principal 은 UserDetails 를 상속받은 클래스를 말한다.
실제 동작을 보면 조회해오는 과정에서 null 값이 찍히는 것을 확인할 수 있었다.
여기서 principals 라는 객체는 ConcurrentHashMap 자료 구조를 사용하고 있었는데, get 을 이용해도 그것과 유사한 객체를 가져오지 못하는 이유는 내가 추가했던 CustomUserDetails 클래스에서 equals() 와 hashCode() 메서드를 오버라이딩 하지 않았기 때문이였다.
위와 같이 CustomUserDetails 클래스에 오버라이딩해서 해결할 수 있었다.
(이를 통해 다시 한번 equals(0 와 hashCode() 의 중요성을 체감했다.)
'기타 > 문제 해결' 카테고리의 다른 글
윈도우에서 PostgreSQL의 PSQL(UTF8) 사용 시 한글 깨짐 문제 해결 (0) | 2025.01.14 |
---|---|
Spring @WebMvcTest 사용 시 Security 설정 제거하기 (0) | 2024.12.10 |
Resilience4J의 CircuitBreak 호출 시 FeignClient 쿠키 값 전달 되지 않는 문제 해결 (0) | 2024.06.29 |
Redis 를 통한 세션 동기화 (0) | 2024.06.28 |
fegin client GET 메서드 요청 시 오류 해결 (0) | 2024.06.17 |