읽은 책 정리/코드로 배우는 스프링 웹 프로젝트

[Spring] 35 자동 로그인(remember-me)

포포015 2021. 3. 1. 23:13

한번 로그인을 하면 일정시간동안 다시 로그인을 하지 않아도 되는 기능이 있다(자동로그인or 로그인기억하기)

영어로는 'remember-me' 라고하는데 이 기능은 대부분 쿠키(Cooke)를 이용해 구현한다.

 

스프링 시큐리티의 경우 'remember-me' 기능을 메모리상에서 처리하거나,

DB를 이용하는 형태로 약간의 설정만으로 구현 가능하다.

security-context.xml에 <security:remember-me>태그를 이용해서 구현한다.

아래와 같이 여러 속성값을 지정할수 있다. 주로 사용되는 속성은 아래와 같다

key 쿠키에 사용되는 값을 암호화 하기 위한 키(Key)값
data-source-ref DataSource를 지정하고 테이블을 이용해서 기존 로그인 정보를 기록(옵션)
remember-me-cookie 브라우저에 보관되는 쿠키의 이름을 지정한다.
기본값은 'remember-me'이다
remember-me-parameter 웹 화면에서 로그인할때 'remember-me'는 대부분 체크박스를 이용해 처리한다.
이때 체크박스 태그는 name속성을 의미한다
token-validity-seconds 쿠키의 유효시간을 지정한다

 

 

데이터베이스를 이용하는 자동로그인

자동 로그인 기능을 처리하는 방식중 가장 많이 사용되는 방식은 로그인이 되었던 정보를

DB를 이용해서 기록해 두었다가, 사용자의 재방문시 세션에 정보가 없으면 DB를 조회해서 사용하는 방식이다.

스프링 시큐리티에서 'remember-me'기능

역시 JDBC를 이용하는 경우처럼

1)지정된 이름의 테이블을 생성하면 ,지정된 SQL문이 실행되며 이를 처리하는 방식과

2)직접 구현하는 방식이 있다

생성된 테이블은 로그인을 유지하는데 필요한 정보를 보관하는 용도일뿐이라 커스터마이징 할필요가 크게없다

 

 

시큐리티 공식문서에 나오는 로그인 정보를 유지하는 테이블은 아래와 같은 스크립트로 구성된다.

(DB에 맞게 테이블이름과 칼럼명을 제외한 칼럼의 타입등을 적당히 조정해서 사용하면됨)

1
2
3
4
5
create table persistent_logins(
username varchar2(64not null,
series varchar2(64PRIMARY key,
token varchar2(64not null,
last_used timestamp not null);
cs

 

자동 로그인에서 DB를 이용하는 설정은 별도의 설정없이 data-source-ref 만 지정하면된다.

<security:http> 태그안에 아래의설정을 추가해주면 끝...

1
2
3
        <!-- DB를 이용한 자동로그인 -->
        <security:remember-me data-source-ref="dataSource" token-validity-seconds="604800"/>
 
cs

 

로그인 화면에 자동 로그인 설정

자동 로그인은 로그인 화면ㅁ에서 선택해서 처리되므로,체크박스 형태로 구현하고

<input>태그의 name 속성값은 'remember-me' 이다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<form method="post" action="/login">
    <div>
        <input type="text" name="username" value="">
    </div>
 
    <div>
        <input type="password" name="password" value="">
    </div>
    
    <div>
        <input type="checkbox" name="remember-me">Remember Me
    </div>
 
    <div>
        <input type="submit">
    </div>
    <!--  csrf 공격 방어를 위해 동적 생성 -->
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token }" />
 
</form>
cs

프로젝트를 실행하고 Remeber Me를 체크한후 쿠키를 조사해보면 ,

자동으로 'remember-me'라는 이름의 쿠키가 생긴것을 확인할수 있다

 

데이터베이스의 'persistence_logins'테이블에도 사용자가 로그인한 정보가 남아있는것을 확인할수 있다

remember-me 이름으로 생성된 쿠키는 유효기간이 있으므로, 사용자는 브라우저를 완전히 종료한후에

다시 /sample/admin과 같이 로그인이 필욯나 페이지에 접근하면 정상적으로 로그인이 되는것을 확인할수 있다.

브라우저를 종료한후 '/sample/admin'을 호출했을때 브라우저가 보내는 정보를 확인해보면

remember-me 쿠키의 정보가 전송되는것을 볼수 있다.

 

로그아웃시 쿠키삭제

자동 로그인 기능을 이용하는 경우 사용자가 로그아웃을 하면 기존과 달리

자동 로그인에 사용하는 쿠키도 삭제 해주도록 쿠키를 삭제하는 항목을 추가로 지정해줘야한다.

 

1
2
3
        <!-- 로그아웃 처리후 세션 무효화 -->
        <security:logout logout-url="/customLogout" invalidate-session="true" delete-cookies="remember-me,JSESSION_ID"/>
        
cs

별도의 설정이없엇다면 자동 로그인이 사용한 쿠키이름은 'remember-me'였을것이고

Tomcat을 통해 실행되고 있었다면 WAS가 발행하는 쿠키이름은 'JSESSION_ID'이다. 

로그아웃시 관련된 쿠키를 같이 삭제해주는게 좋다.