STUDY/Spring boot

JWT token blackList 관리

uragiljay 2025. 8. 13. 02:01
반응형

현재 로그아웃 시 Set<String> blacklist = new HashSet<>() 으로 

메모리에 blackList.add 로 list를 만들고 filter 에서 검증하는 구조의 프로젝트

 

블랙리스트는 서버 메모리에 저장 → 서버 재시작하면 초기화되지만

그 사이 로그아웃이 빈번하게 일어나는 업무프로세스

여러 건의 로그아웃 시 메모리 부담이 될 수 있어 스케줄을 통한 블렉리스트 초기화를 구현 하려고 함 

 

추가 할 프로젝트 구조

Project

 ├─ blacklist/        <-- 블랙리스트 관련 서비스
                 │    └─ BlacklistService.java   (블랙리스트 서비스를 따로 관리 할 경우)
                 └─ scheduler/        <-- 스케줄러 관련 코드
                      └─ BlacklistCleanupScheduler.java
                 └─ MyApplication.java  <-- 메인 애플리케이션

 

 

BlacklistService.java

package com.example.blacklist;

import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.Set;

@Service
public class BlacklistService {

    private final Set<String> blacklist = new HashSet<>();

    // 토큰 추가
    public void add(String token) {
        blacklist.add(token);
    }

    // 블랙리스트 포함 여부 체크
    public boolean contains(String token) {
        return blacklist.contains(token);
    }

    // 블랙리스트 초기화
    public void clear() {
        blacklist.clear();
    }

    // 내부 Set 직접 반환 (스케줄러용)
    public Set<String> getBlacklist() {
        return blacklist;
    }
}

 

 

BlacklistCleanupScheduler.java

package com.example.scheduler;

import com.example.blacklist.BlacklistService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class BlacklistCleanupScheduler {

    private final BlacklistService blacklistService;

    public BlacklistCleanupScheduler(BlacklistService blacklistService) {
        this.blacklistService = blacklistService;
    }

    // 운영용: 매일 새벽 3시에 블랙리스트 초기화
    @Scheduled(cron = "0 0 3 * * *")
    public void clearBlacklistDaily() {
        blacklistService.clear();
        System.out.println("블랙리스트 초기화 완료 (cron)");
    }

    /*
    // 개발/테스트용: 1분마다 초기화하려면 주석 해제 후 사용
    @Scheduled(fixedRate = 60000)
    public void clearBlacklistTest() {
        blacklistService.clear();
        System.out.println("블랙리스트 초기화 완료 (fixedRate)");
    }
    */
}

 

 

MyApplication.java (메인 애플리케이션)

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
반응형