00. 상황
JWT 인증 방식에서 Access Token의 취약한 부분을 보완하기 위해 Refresh Token
을 추가로 사용한다.
이때 Refresh Token은 비교적 안전하지만, 긴 생명 주기를 가지기 때문에 한번 탈취될 경우를 대비하여 서버에서 직접 관리를 할 필요가 있다.
이를 위해 내가 진행중인 프로젝트에서는 Refresh Entity를 정의하여, 토큰이 발급될 때마다 DB에 저장하는데, 이때 만료된 토큰이 제거되지 않고 계속 쌓이는 문제점을 발견했다.
이를 해결하기 위해 스케줄러를 사용하여, 자동으로 만료된 Refresh Token을 제거하는 로직을 도입했다.
01. 스케줄러 사용법
스케줄러 사용법은 간단하다.
1. Application.java
@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling
public class LimgDiaryApplication {
public static void main(String[] args) {
SpringApplication.run(LimgDiaryApplication.class, args);
}
}
먼저 MainApplication
클래스에 위 코드처럼 @EnableScheduling
아노테이션을 붙여준다.
2. @Scheduled
이후에 스케줄링 로직이 정의된 메소드에 @Scheduled
아노테이션을 붙여주면 된다.
@Scheduled(fixedDelay = 1000 * 60 * 60)
fixedDelay
속성은 스케줄러가 작동되는 텀을 의미한다. 밀리세컨 단위를 사용한다.
해당 속성 외에도 아래와 같은 속성들이 있다.
fixedDelay
: 이전 테스크 종료 후를 기준으로 카운트fixedRate
: 이전 테스크의 시작 시점부터 카운트initialDelay
: 카운트를 바로 시작하지 않고 지연 시간 설정cron
: 표현식을 사용하여 시간을 직접 설정- 이때 주의할 점이 있는데,
@Scheduled
아노테이션을 사용할 클래스는Bean
객체로 등록이 되어야 한다.
02. Refresh 스케줄러 로직
@Scheduled(fixedDelay = 1000 * 60 * 60) // 1 hours
public void scheduledDeleteRefresh() {
// get all refresh
ArrayList<RefreshEntity> refreshEntities = refreshRepository.findAllByOrderByCreatedDateAsc();
// get current date
LocalDate current = LocalDate.now();
Iterator<RefreshEntity> iter = refreshEntities.iterator();
while(iter.hasNext()){
RefreshEntity refresh = iter.next();
LocalDate refreshDate = refresh.getCreatedDate();
// delete refresh :: order 14 day
if (refreshDate.until(current, ChronoUnit.DAYS) > 14){
iter.remove();
deleteRefresh(refresh.getRefresh());
}
else{
break;
}
}
}
나 같은 경우엔 1시간마다 스케줄러가 작동되도록 설정했다.
로직은 아래와 같다.
1. 스케줄러가 실행되면 모든 `Refresh Entity`를 오래된 순으로 가져옴
2. 토큰이 생성된 날짜와 현재 날짜의 차를 계산
3. 만약 계산된 값이 14(2주) 이상이면 해당 토큰은 제거
이제 만료된 토큰이 DB에 쌓일 걱정은 없다.
나중엔 Redis를 사용한 방법으로도 구현해 봐야겠다.
Refrence
'Back End > Spring && Spring Boot' 카테고리의 다른 글
[Spring boot] SSE를 사용해서 서버에서 클라이언트로 이벤트 전송하기 (2) | 2024.09.08 |
---|---|
[EC2, Spring boot] 스프링 부트 배포시, 우분투 환경에서 이미지 경로 인식 못하는 문제 (0) | 2024.08.15 |
[Spring Boot] CORS 설정하기 (0) | 2024.08.05 |
[Spring boot / JWT] Spring security를 사용해서 Refresh Token 구현하기 (2) | 2024.07.13 |
[Spring Security / JWT] 스프링 부트에서 JWT 구현하기 with Spring Security (0) | 2024.07.10 |