[스프링 시큐리티] 자동 로그인 구현하기

charco·2021년 6월 10일
0

출처: 코드로 배우는 스프링 웹 프로젝트

인증과 인가에 대한 구현을 마쳤으니
마지막으로 자동 로그인 기능을 구현해보자.

쿠키를 이용한 자동 로그인

이 글에서 우리는 자동 로그인 체크박스를 만들 것이다.
그 체크박스를 체크하고 로그인하게 되면 브라우저를 종료하던 서버가 재실행되던 인증은 유지돼있을 것이다.
왜냐하면 remember-me 쿠키가 브라우저에 저장돼있고 해당 쿠키의 로그인 정보가 데이터베이스에도 저장돼 있을 것이기 때문이다.

자동 로그인 체크 -> remember-me 쿠키 브라우저에 저장 
-> 사이트 재방문 -> 서버가 쿠키에 해당하는 정보를 데이터베이스에서 불러옴 
-> 인증유지

테이블 설계

JDBC를 이용해 스프링 시큐리티를 이용했던 것처럼
스프링 시큐리티의 공식 문서를 따라 기본 테이블을 구성하자. 이 테이블은 로그인 정보를 유지하는 역할을 하기 때문에
커스터마이징하기보단 그대로 사용하는 것이 효율적이다.

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

그리고 스프링 시큐리티가 자동 로그인 기능을 할 수 있도록
security-context.xml 을 수정하자.

<security:http>
	...생략
  
  <!--dataSource를 주입하고 토큰 유효 시간에 7일을 설정함-->
  <security:remember-me data-source-ref="dataSource" token-validity-seconds="604800"/>

</security:http>

이제 로그인 폼에 name 속성이 remember-me 인 체크박스를 추가하자.

<input type="checkbox" name="remember-me"> remember-me

이 체크박스를 체크하고 서버에 요청하면(/login)
스프링 시큐리티가 알아서 우리가 만들었던 테이블에 로그인 정보를 넣고 브라우저에는 remember-me 쿠키를 저장한다.

서버를 재실행해서 로그인 해보자. 크롬 개발자 도구에 remember-me 라는 쿠키가 생겼을 것이다. JSESSION_ID를 삭제하고 다시 URI를 요청해도 인증이 유지되는 것을 확인할 수 있을 것이다.


로그아웃 시 쿠키 삭제하기

로그아웃 시에 remember-me 쿠키를 삭제해줘야 한다.
관련된 쿠키(JSESSION_ID)도 같이 삭제해 주는 것이 좋다.
security-context.xml 의 security:logout을 다음과 같이 수정한다.

<security:logout logout-url="/sample/customLogout" invalidate-session="true"                  
delete-cookies="remember-me, JSESSION_ID"/>

이제 로그아웃을 하면 remember-me 쿠키가 삭제되는 것을 볼 수 있다.


이로써 우리는 스프링 시큐리티를 통해 할 수 있는 많은 것을 구현해봤다. 프로젝트에 적용시키며 기억을 되새겨보자

profile
아직 배우는 중입니다

0개의 댓글