자동로그인 (remember-me)

최근 웹페이지들은 ‘자동로그인', ‘로그인 기억하기' 라는 이름으로 한번 로그인하면 일정 시간 동안 다시 로그인을 하지 않아도 되는 기능을 구현하고 있다.
스프링 시큐리티는 ①메모리상에서 처리 ,②데이터베이스 이용하여 간단한 설정만으로 구현이 가능하다.
<security:remember-me> 태그를 이용하여 설정한다.

1. remember-me 태그의 속성들

  • key : 쿠키에 사용되는 값을 암호화하기 위한 키값
  • data-source-ref : remember-me 를 데이터베이스를 이용하여 설정할 때 사용하는 DataSource 설정
  • remember-me-cookie : 브라우저에 보관되는 쿠키의 이름 지정, 기본은 ‘remember-me'
  • remember-me-parameter : 화면상에서 remember-me를 설정하기 위한 input의 name
  • token-validity-seconds : 쿠키의 유효시간 지정

2. 데이터베이스를 이용하여 자동로그인 처리하기

①지정된 테이블과 지정된 SQL을 사용하는 방법, ②직접 구현하는 방법 두가지가 있다.
여기서는, 지정된 테이블을 사용하는 예제를 다룰 것이다.

지정된 테이블 스키마 생성하기

create table persistent_logins (
		username varchar(64) not null,
        series varchar(64) primary key,
        token varchar(64) not null,
        last_used timestamp not null
);

security-context.xml 에 설정 추가하기

데이터소스만 지정해 주면 된다. ( <security:remember-me data-source-ref="dataSource" token-validity-seconds="604800"/>)

<security:http>
		<security:intercept-url pattern="/sample/all" access="permitAll"/>
		<security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/>
		<security:intercept-url pattern="/sample/admin" access="hasRole('ROLE_ADMIN')"/>
		<security:form-login login-page="/customLogin" authentication-success-handler-ref="customLoginSuccessHandler"/>
		<security:logout logout-url="/customLogout" invalidate-session="true" delete-cookies="remember-me, JSESSIONID" success-handler-ref="customLogoutSuccessHandler"/>
		<!-- 여기 -->
        <security:remember-me data-source-ref="dataSource" token-validity-seconds="604800"/>
		<security:access-denied-handler ref="customAccessDenied"/>
	</security:http>

로그아웃 시, 쿠키 제거하기

security-context.xml 의 <security:logout>태그에 delete-cookies 속성을 추가한다.

<security:http>
		<security:intercept-url pattern="/sample/all" access="permitAll"/>
		<security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/>
		<security:intercept-url pattern="/sample/admin" access="hasRole('ROLE_ADMIN')"/>
		<security:form-login login-page="/customLogin" authentication-success-handler-ref="customLoginSuccessHandler"/>
        <!-- 여기 -->
		<security:logout logout-url="/customLogout" invalidate-session="true" delete-cookies="remember-me, JSESSIONID" success-handler-ref="customLogoutSuccessHandler"/>
        <security:remember-me data-source-ref="dataSource" token-validity-seconds="604800"/>
		<security:access-denied-handler ref="customAccessDenied"/>
	</security:http>