위와 같은 의문이 들었습니다.
Mysql을 사용했을 때처럼 주기적으로 Mysql에 저장된 토큰을 검사하여 만료된 토큰을 직접 삭제하는 로직을 개발자가 작성하지 않아도 되지만
Redis를 사용하면 결국에는 Redis의 CPU가 주기적으로 토큰의 만료여부를 검사하는 건가? 라는 생각이 들었습니다.
즉 CPU가 주기적으로 DB를 검사하는 건 똑같으나 개발자가 직접 해당 로직을 처리하지 않아도 된다라는 장점이다. 라고 생각했습니다.
즉 Redis는 만료된 키를 삭제하는 방식이 수동적 만료, 능동적 만료 2가지 방식을 가지고 있다는 것을 공식문서를 통해 확인했습니다.
Redis는 수동 만료 정책을 이용해서 CPU의 과부하를 줄입니다.
Redis가 지속적으로 만료된 키를 검색하지 않기 때문에 CPU를 절약할 수 있다
현 EEOS에서는 블랙리스트 토큰을 저장하는데 redis에 저장하고 있고 이때 expire를 통해서 토큰이 유효할 때까지만(만료 시간이 지나지 않았을 때까지)관리를 하고 있습니다.
하지만 Redis에 저장된 토큰들은 해당 토큰으로 요청이 들어온다면 비정상적인 토큰임을 판단하기 위함이기 때문에
다시는 Redis에 저장된 토큰에 접근하지 않을 가능성이 더 높았습니다.
즉 만약 Redis가 수동적 만료 방식으로 TTL이 설정된 key를 삭제한다면 예상과는 달리 Redis에 토큰이 계속 저장이 되는 상황이였습니다.
기존에는 토큰 저장 관리소는 Mysql에서 하고 있었습니다.
하지만 Mysql에서는 만료된 토큰이라도 계속 저장을 하고 있었고
이를 삭제하기 위해서는 주기적으로 Mysql을 탐색하여 만료된 토큰을 삭제해야 합니다.
위와 같은 별도의 리소스를 투입하지 않기 위해서 Redis에 토큰의 만료시간을 기준으로 토큰을 저장하도록 하였고
토큰이 만료되면 토큰이 Redis에서 삭제되도록 하는게 기대되는 효과였습니다.
따라서 수동적 만료 방식만으로 TTL이 설정된 키를 지우는 게 Redis의 동작방식이라면 MySql -> Redis로 인프라를 변경할 이유가 없어졌습니다.
Redis에서는 기본전략으로 수동적 만료 방식을 사용하고
더 이상 접근되지 않았지만 만료된 키를 삭제하기 위해서 가볍게 설계된 능동 삭제 방식도 같이 사용합니다.
기본적으로는 수동 만료 정책을 이용해서 요청이 들어온 key를 확인하고 해당 key가 만료되었다면 삭제처리를 한다.
하지만 위 방식만으로는 TTL이 설정된 모든 key를 삭제할 수가 없다.
(다시는 접근하지 않는 key가 있을 수 있으므로)
따라서 능동 만료 정책을 이용해서 TTL이 설정된 key 집합 중에서 일부를 테스트하여 만료된 키가 있다면 삭제를 한다.