기타/문제 해결

Spring Security 세션 정책 적용되지 않는 문제 해결

펭귄힝 2024. 12. 12. 12:38

 

Spring Security에서 위와 같이 동시 로그인을 차단하는 세션 정책을 설정하였으나 적용되지 않는 문제가 발생했다.

 

 

 

 

 

 

 

문제의 원인을 파악하고자 스프링 시큐리티에서 제공하는 세션 관련 클래스들을 찾아봤다.

 

그 중 동시 접속과 관련된 세션 처리를 하는 ConcurrentSessionControlAuthenticationStrategy.class 를 발견할 수 있었고

 

브레이크 포인트를 찍어서 디버깅해보았다.

 

위 사진에 보면 sessionRegistry.getAllSessions() 메서드를 호출하는데, 인증 객체의 Principal 값을 토대로 그것과 유사한 모든 세션을 조회해오는 메서드이다. 여기서 Principal 은 UserDetails 를 상속받은 클래스를 말한다.

 

 

 

실제 동작을 보면 조회해오는 과정에서 null 값이 찍히는 것을 확인할 수 있었다.

 

여기서 principals 라는 객체는 ConcurrentHashMap 자료 구조를 사용하고 있었는데, get 을 이용해도 그것과 유사한 객체를 가져오지 못하는 이유는 내가 추가했던 CustomUserDetails 클래스에서 equals() 와 hashCode() 메서드를  오버라이딩 하지 않았기 때문이였다.

 

 

 

 

 

위와 같이 CustomUserDetails 클래스에 오버라이딩해서 해결할 수 있었다.

(이를 통해 다시 한번 equals(0 와 hashCode() 의 중요성을 체감했다.)