Session Management

배세훈·2021년 8월 8일
0

Spring

목록 보기
6/38

Session Management

HTTP 세션 관련 기능은 SessionManagementFilter와, 이 필터가 위임하는 SessionAuthenticationStrategy 인터페이스가 처리한다.

전형적으로 session-fixation 공격을 방어하고, 세션 타임아웃을 감지하고, 인증된 사용자가 동시에 열 수 있는 세션 수를 제한하는 등에 사용한다.

커스터마이징이 필요하다면 SessionManagementFilter 와 SessionAuthenticationStrategy의 디폴트 구현체를 상속받거나 구현해서 사용

Detecting Timeouts

스프링 시큐리티는 유효하지 않은 세션 ID를 제출하면 이를 감지해서 적절한 URL로 리다이렉트할 수 있다. 이는 session-management 요소로 설정한다.

<http>
<session-management invalid-session-url="/invalidSession.htm" />
</http>

이 메커니즘으로 세션 타임아웃도 감지하도록 설정했다면, 로그아웃한 사용자가 브라우저를 닫지 않고 다시 로그인했을 때 에러로 오인할 수 있다.
-> 세션을 무효화 할 때 세션 쿠키를 비워야한다.
-> 세션 로그아웃 핸들러를 커스터마이징
ex)

<http>
<logout delete-cookies="JSESSIONID" />
</http>

Concurrent Session Control

스프링 시큐리티에서 간단하게 몇 가지만 추가하면 같은 사용자가 여러 번 로그인할 수 없도록 제한할 수 있다.

먼저 web.xml 파일에 아래 리스너를 추가하면, 스프링 시큐리티는 세션 라이프사이클 이벤트 통지를 받는다.

리스너를 추가해서 세션 라이프사이클을 수정할 수 있다라는 의미다.

<listener>
<listener-class>
	org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>

그 다음 어플리케이션 컨텍스트에 다음을 추가

<http>
<session-management>
	<concurrency-control max-sessions="1" />
</session-management>
</http>

-> 같은 사용자는 로그인을 여러번 할 수 없다. 이후 다시 로그인하면 그 전 로그인을 무효로 만든다. 재로그인 방지는 아래 코드 사용

<http>
<session-management>
	<concurrency-controle max-sessions="1" error-if-maximum-exceeded="true" />
</session-management>
</http>

-> 두 번째 로그인부터는 거부한다. "거부"란, 폼 기반으로 로그인한 사용자는 authentication-failure-url로 이동됨을 의미한다.

에러 페이지가 따로 있다면 session-management 요소에 session-authentication-error-url 속성을 추가하면 된다.

profile
성장형 인간

0개의 댓글