왜 세션 폐기(Revocation)가 어려운가
세션 인증 방식은 서버가 세션 상태를 직접 관리하기 때문에, 특정 세션을 무효화하는 작업이 직관적으로 보인다. 하지만 Canva처럼 1억 개의 활성 세션을 운영하는 환경에서는 이야기가 달라진다. 보안 이벤트 발생 시 특정 사용자의 세션을 즉시 만료시켜야 하는데, 매 요청마다 데이터베이스를 조회하면 조회 빈도와 인프라 비용이 기하급수적으로 증가한다. 반대로 캐싱을 과하게 활용하면 폐기된 세션이 캐시 TTL이 끝날 때까지 살아남는 보안 공백이 생긴다. 결국 성능과 보안 사이의 트레이드오프를 어떻게 설계하느냐가 핵심 과제다.
Canva의 아키텍처 설계 전략
Canva는 이 문제를 두 가지 핵심 컴포넌트의 조합으로 해결했다.
- Amazon S3를 영구 폐기 레코드 저장소로 활용: 세션 폐기 이벤트가 발생하면 해당 기록을 S3에 저장한다. S3는 높은 내구성과 가용성을 제공하면서도 관계형 DB처럼 실시간 쿼리 부하를 받지 않는다.
- 압축된 인메모리 인덱스를 애플리케이션 게이트웨이에 분산 배포: S3에 저장된 폐기 목록을 주기적으로 읽어 압축된 인덱스 구조로 변환한 뒤, 각 게이트웨이 인스턴스의 메모리에 올려둔다. 요청이 들어오면 DB를 거치지 않고 이 인메모리 인덱스만 조회하여 세션 유효성을 판단한다.
이 구조의 핵심은 읽기 경로와 쓰기 경로를 완전히 분리한 것이다. 폐기 이벤트는 S3로 비동기 기록되고, 각 게이트웨이는 이를 주기적으로 풀링하여 로컬 인덱스를 갱신한다. 덕분에 실시간 DB 조회 없이도 최신에 가까운 폐기 정보를 유지할 수 있다.
[세션 폐기 이벤트]
│
▼
[S3 영구 저장소] ←──────────────────────┐
│ │
(주기적 동기화) │
▼ (폐기 기록)
[인메모리 압축 인덱스] [세션 폐기 서비스]
(각 게이트웨이 로컬)
│
(인증 요청 시)
▼
[DB 조회 없이
로컬 인덱스 검증]
실무에서 얻을 수 있는 인사이트
이 설계는 단순히 Canva만의 이야기가 아니다. JWT 기반 무상태 인증을 쓰는 서비스에서도 토큰 블랙리스트 관리 문제로 동일한 고민이 반복된다. 보통은 Redis를 블랙리스트 저장소로 쓰지만, 세션 수가 수천만 단위를 넘어서면 Redis 클러스터 운영 비용과 복잡도가 급격히 올라간다.
Canva가 선택한 S3 + 인메모리 인덱스 패턴은 몇 가지 설계 원칙을 잘 보여준다.
- 저장소 특성에 맞는 역할 분리: 영구성과 내구성이 필요한 레코드 보관은 S3에, 저지연 조회가 필요한 부분은 인메모리로 분리한다.
- 압축 자료구조 활용: 수억 건의 폐기 레코드를 메모리에 올리려면 Bloom Filter나 Roaring Bitmap 같은 공간 효율적인 자료구조가 필수적이다. Canva는 이를 통해 캐시 메모리 사용량을 87.5% 절감했다.
- 배포 독립성 확보: 게이트웨이가 S3에서 직접 인덱스를 갱신하므로, 중앙 DB 스케일아웃 없이도 게이트웨이 인스턴스를 수평 확장할 수 있다.
// 개념적 예시: 인메모리 폐기 인덱스 조회
public class RevocationIndex {
private final RoaringBitmap revokedSessionIds;
public boolean isRevoked(long sessionId) {
return revokedSessionIds.contains((int) sessionId);
}
public void refresh(S3Client s3, String bucket, String key) {
// S3에서 최신 폐기 목록 다운로드 후 비트맵 재구성
byte[] data = s3.getObject(bucket, key);
this.revokedSessionIds = RoaringBitmap.deserialize(data);
}
}
정리
- 세션 폐기를 S3(영구 저장) + 인메모리 인덱스(저지연 조회) 구조로 분리하면 DB 부하를 획기적으로 줄일 수 있다.
- Bloom Filter, Roaring Bitmap 등 압축 자료구조 활용은 수억 건 규모의 폐기 목록을 메모리에서 다루는 핵심 기법이다.
- 읽기/쓰기 경로를 분리하고 게이트웨이가 독립적으로 인덱스를 갱신하면 수평 확장과 배포 유연성을 동시에 확보할 수 있다.
Source
InfoQ