스프링 시큐리티 4편 -자동 로그인
remember-me
스프링 시큐리티의 ‘remember-me(로그인 기억하기 혹은 자동로그인)’기능은 쿠키를 이용해서 브라우저에 로그인 했던 정보를 유지하기 때문에 매번 로그인을 실행할 필요가 없어진다.
이러한 기능 때문에 PC, 모바일 등 여러 환경에서 자동로그인 기능을 많이 사용하고 있을 것이다.
자동로그인의 쿠키값을 생성할 때 필요한 정보를 보관하기 위해 여러 방법이 있지만 지금 사용하고 있는 데이터베이스를 이용을 해 볼 것이다.
- 자동 로그인의 정보를 위한 테이블 생성
1
2
3
4
5
6
create table persistent_logins(
username varchar(64) not null,
series varchar(64) primary key,
token varchar(64) not null,
last_used timestamp not null
);
이때 쿠키와 관련된 정보를 테이블로 보관하도록 지정하는데 DataSource가 필요하고 UserDetailsService타입의 객체가 필요하니 코드를 수정해보자.
- CustomSecurityConfig 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@Configuration
@Log4j2
@RequiredArgsConstructor
@EnableMethodSecurity
public class CustomSecurityConfig {
//주입 필요
private final DataSource dataSource;
private final CustomUserDetailsService userDetailsService;
....
@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception{
//커스텀 로그인 페이지
http.formLogin(form ->{
form.loginPage("/member/login");
});
//CSRF 토큰 비활성화
http.csrf(httpSecurityCsrfConfigurer -> httpSecurityCsrfConfigurer.disable());
http.rememberMe(httpSecurityRememberMeConfigurer -> {
httpSecurityRememberMeConfigurer.key("12345678")
.tokenRepository(persistentTokenRepository())
.userDetailsService(userDetailsService)
.tokenValiditySeconds(60*60*24*30);
});
return http.build();
}
@Bean
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl repo = new JdbcTokenRepositoryImpl();
repo.setDataSource(dataSource);
return repo;
}
쿠키를 생성할 때 쿠키의 값을 인코딩하기 위해 키값과 필요한 정보를 정하는 tokenRepository를 지정한다.
그래서 위에 코드에서 persistentTokenRepository()라는 메소드를 이용해 이를 처리하였다.
자동로그인을 위한 화면 설정
자동로그인을 활성화 하기 위해서 자동로그인의 값이 같이 전달되어야 하기에 로그인 페이지에 체크박스 인풋을 하나 추가한다.
- 로그인 html
1
2
3
4
5
6
7
8
9
10
11
12
<div class="input-group mb-3">
<span class="input-group-text">아이디</span>
<input type="text" name="username" class="form-control" placeholder="USER ID">
</div>
<div class="input-group mb-3">
<span class="input-group-text">비밀번호</span>
<input type="text" name="password" class="form-control" placeholder="PASSWORD">
</div>
<div class="input-group mb-3">
<input class="form-check-input" type="checkbox" name="remember-me">
<label class="form-check-label">자동로그인</label>
</div>
이렇게 설정하고 로그인 페이지를 호출해서 로그인하면 ‘remember-me’라는 이름의 쿠키가 생성된 것을 확인할 수 있다.
쿠키가 정상적으로 생성되었다면 브라우저를 종료한 후에 다시 권한이 필요한 페이지에 접근하면 자동으로 로그인된 것을 확인할 수 있다.
데이터베이스에 ‘persistent_logins’를 조회하면 다음과 같이 user1 계정의 쿠키가 유지되는 모습 또한 확인할 수 있다.
로그아웃의 경우 기본 설정은 ‘remember-me’쿠키의 삭제이다.
주소창에 로그아웃 호출하는 것도 정상적으로 처리가 되며 그와 동시에 데이터베이스에 ‘persistent_logins’ 테이블에 쿠키 정보가 삭제되는 것이 확인된다.