2024.11.27 - [# Study/Spring] - [Spring] Spring Security + JWT 구현 해보기 (다중 토큰) (2)
[Spring] Spring Security + JWT 구현 해보기 (다중 토큰) (2)
Spring Security + JWT 다중토큰 코드를 작성하려고 한다.우선, 이전 Srping Security + JWT 단일토큰 포스팅의 코드를 가져와 수정하여 작성할 것이기 때문에 코드를 보려면 링크를 따라가면 확인 할 수 있
jiy0ung.tistory.com
이전 포스팅인 Spring Security + JWT 다중토큰 로그인을 공부하면서 문제점을 발견했다.
로그인을하고 로그아웃을 하지 않으면 재로그인시 RefreshToken이 또 생성되어서 한 ID의 RefreshToken이 2개가 저장되었다.
또, 만료기간이 지난 토큰이 쌓여 불필요한 데이터가 많아질 것을 대비해야겠다는 생각을했다.
그래서 재로그인 시, RefreshRepository를 이용해 해당 유저에 대한 Token을 조회하여 존재하는 토큰이 있다면 삭제하고, Token 생성/저장 없으면 바로 Token 생성/저장을 추가하려고 한다. 그리고 토큰이 쌓일 것을 대비해서 @Scheduled를 이용하여 매일 자정마다 Token 만료시간을 검사해서 만료시간이 지난 토큰은 삭제하는 코드를 추가 하려고 한다.
LoginFilter 파일 안에 successfulAuthentication() 메소드에 토큰 생성 전에 이 코드를 넣어줬다.
이렇게 코드를 추가하고 실행해보면 재로그인 시, 토큰이 여러개 생성되는 부분을 막을 수 있었다.
List<RefreshEntity> refreshList = refreshRepository.findByUsername(username);
if(!refreshList.isEmpty()){
refreshRepository.deleteByUsername(username);
}
다음으로는, @Scheduled를 이용하여 매일 밤 자정마다 Token 만료 시간을 검사해 삭제하는 작업을 해준다.
먼저, 메인 클래스에 @EnableScheduling 어노테이션을 붙여준다.
@SpringBootApplication
@EnableScheduling
public class SecurityJwtTokenApplication {
public static void main(String[] args) {
SpringApplication.run(SecurityJwtTokenApplication.class, args);
}
}
그리고나서 나는 TokenScheduleTasks라는 파일을 만들어 @Component를 붙여주어 빈으로 등록해주고,
cron 표현식으로 매일 자정에 TokenVerified 메소드가 실행되게 주기를 설정 했다.
만료시간이 현재 이전인 토큰을 삭제 해주는 코드를 작성하였다.
@Component
@RequiredArgsConstructor
public class TokenScheduleTasks {
private final RefreshRepository refreshRepository;
// 초 분 시 일 월 요일
@Scheduled(cron = "0 0 0 * * *")
public void TokenVerified() {
List<RefreshEntity> refreshList = refreshRepository.findAllByOrderByRefreshAsc();
for (RefreshEntity refreshEntity : refreshList){
if(refreshEntity.getExpiration().isBefore(LocalDateTime.now())){
refreshRepository.deleteByRefresh(refreshEntity.getRefresh());
System.out.println("delete refresh " + refreshEntity.getId());
}
}
}
}
@Scheduled말고도 스케쥴링을 위한 기술로 Spring batch, Quartz 등 다양하다고 한다!
'# Study > Spring' 카테고리의 다른 글
[Spring] @Controller, @RestController 차이 (0) | 2025.01.21 |
---|---|
[Spring] Spring Security + JWT 구현 해보기 (다중 토큰) (2) (0) | 2024.11.27 |
[Spring] Spring Security + JWT 구현 해보기 (다중 토큰) (1) (1) | 2024.11.26 |
[Spring] Spring Security + JWT 구현하기 (단일 토큰) (0) | 2024.11.26 |
[Spring] Spring Security 개념과 작동방식 (0) | 2024.11.16 |