MAXIMUM SESSIONS OF 1 FOR THIS PRINCIPAL EXCEEDED 해결하기

작성: 2021.06.10

수정: 2021.06.10

읽는시간: 00 분

Programming/JPA ⁄ Spring

반응형

MAXIMUM SESSIONS OF 1 FOR THIS PRINCIPAL EXCEEDED 해결하기


Spring Security를 사용해 로그인 인증 처리를 하고 있습니다. 정상적으로 로그인, 로그아웃이 이루어지고 있는데 특정 시점마다 자꾸 로그인이 제대로 되지 않는 문제가 있었습니다.

Session의 에러 메시지를 확인 하니

MAXIMUM SESSIONS OF 1 FOR THIS PRINCIPAL EXCEEDED

문제 였고, 해결을 위해 선생님을 찾아 갔습니다.

 

spring security 를 관리하는 xml 파일입니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
	xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:c="http://www.springframework.org/schema/c"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd">

	<!-- <headers> -->
	<!-- <xss-protection block="true" enabled="true"/> -->
	<!-- </headers> -->

	<beans:bean id="passwordEncoder"
		class="org.springframework.security.crypto.factory.PasswordEncoderFactories"
		factory-method="createDelegatingPasswordEncoder" />
	<beans:bean id="successHandler"
		class="best.gaia.main.controller.SuccessHandler"></beans:bean>


	<authentication-manager>
		<authentication-provider user-service-ref="authService">
			<password-encoder ref="passwordEncoder" />
		</authentication-provider>
	</authentication-manager>

	<http pattern="/resources/**" security="none" />

	<http auto-config="true" use-expressions="true">

		<form-login login-page="/signin"
			login-processing-url="/signin/signinCheck"
			username-parameter="mem_id"
			password-parameter="mem_pass"
			authentication-failure-url="/signin"
			always-use-default-target="false"
			authentication-success-handler-ref="successHandler" />

		<logout logout-url="/signout" 
			logout-success-url="/"
			invalidate-session="true" />

		<intercept-url pattern="/" access="permitAll" />

		<session-management>
			<concurrency-control max-sessions="1"
				expired-url="/signin" error-if-maximum-exceeded="true" />
		</session-management>

		<csrf disabled="true" />
	</http>

</beans:beans>


아래의 max-sessions = 1 부분에서 최대 세션을 1개로 제한하고 있는데, 세션을 추가로 생성하려고 했기 때문에 생겼던 문제 입니다.

서버에서는 해당 회원은 이미 로그인이 되어 있는 상태로 인식이 되어 있는데, 클라이언트 사이드 쪽에서 그렇지 않기 떄문입니다.

발생한 시점은 두가지 입니다.

1. session 쿠키를 브라우저에서 삭제 했을때

2. 브라우저를 종료 했을때

 

브라우저를 종료 했다가 다시 켜며 새로운 JSESSIONID가 발급 되었는데, 새로 발급된 세션 아이디에는 로그인 정보가 없지만, 서버 상에서는 해당 회원이 이미 로그인 중 인 것으로 인식하고 있기 때문입니다.

 

		<session-management>
			<concurrency-control max-sessions="5"
				expired-url="/signin" error-if-maximum-exceeded="true" />
		</session-management>

당장은 일단 max-sessions 를 조금 늘려줘서, 30분 안에 해당 세션들이 닫히기를 준비하는 임시 방편의 방법이 있습니다.

 

하지만 더욱 확실하게 해결을 하려면 로그인 정보를 쿠키와 세션을 함께 사용해서 '자동로그인' 기능을 구현 해야 어느정도 해결이 될 것 같습니다.

반응형