CASE · BEGINNER읽기 20분검토일 2026-08-23

URL 단축 서비스
설계

짧은 키를 발급하는 일보다 중요한 것은, 수억 번의 리다이렉트를 빠르게 처리하면서도 삭제·만료·악성 링크 차단을 되돌릴 수 있게 만드는 일입니다.

개념 이해리다이렉트 정책장애 대응운영 관점진도 저장
30초 핵심 요약

자동 키는 유일한 ID를 Base62로 인코딩하거나, 무작위 후보를 만들고 고유 제약으로 충돌을 확정해 발급합니다. 방문 경로는 캐시 → 저장소 → `Location` 리다이렉트로 짧게 유지하되, 만료·삭제·차단 상태도 캐시에 함께 넣습니다.

키 발급Base62 + unique insert
읽기 우선순위Edge cache → DB
철회 안전성Tombstone + purge
01 · REQUIREMENTS

짧은 주소와 안전한 철회를 함께 만든다

# 요구사항

작성자·방문자·운영자의 경로는 다릅니다. 데이터 모델과 캐시 정책은 리다이렉트 성능뿐 아니라 목적지를 나중에 제거할 수 있는지까지 결정합니다.

R1생성과 alias

자동 키와 사용자 alias를 같은 도메인 namespace에서 유일하게 관리합니다.

R2빠른 리다이렉트

`GET`/`HEAD`는 cache hit에서 저장소 왕복 없이 목적지로 보냅니다.

R3수명과 철회

만료·삭제·차단 상태는 어떤 cache layer에서도 목적지보다 먼저 확인합니다.

R4남용 제어

악성 URL 신호와 계정·도메인·IP 기반 운영 제어를 구분합니다.

02 · HIGH-LEVEL DESIGN

생성·저장·캐시·검사를 서로 분리한다

# 아키텍처

생성의 비동기 검사와 클릭 분석은 리다이렉트의 p99를 막지 않습니다. 단, cache value에는 URL만 아니라 상태·만료·정책 버전이 포함되어야 합니다.

URL 단축 서비스의 두 경로 SVG DIAGRAM · 생성 / 저장 / 캐시 리다이렉트 / Safe Browsing
URL 단축 서비스의 생성, 저장, 캐시 리다이렉트와 악성 URL 검사 흐름작성자 요청이 키 발급과 링크 저장소를 거쳐 Safe Browsing 검사와 운영자 검토로 이어지고, 방문자는 edge cache나 redirect service를 통해 목적지로 이동한다.쓰기 경로 · 인증된 작성자읽기 경로 · 방문자생성 APIauth · idempotency키 발급 · URL 정책Base62 · unique insertLink DBstatus · expiry악성 URL 검사Safe Browsing signal운영자 검토 · 차단account / domain abuse controls방문자GET /aZ91kQEdge / Redirect cacheURL + status + versionRedirect servicecache miss → DBLocation301/302…검사 통과 → active위험 신호 → pending / blocked
중요: 리다이렉트 cache의 TTL과 브라우저·공유 cache가 HTTP 응답을 저장하는 기간은 같은 값이 아닙니다. 삭제·차단은 cache purge와 짧은 TTL로 돕되, 이미 장기 저장된 영구 리다이렉트를 즉시 회수할 수 있다고 가정하지 않습니다.
03 · WRITE / READ FLOW

충돌은 DB에서 확정하고, 읽기는 상태까지 캐시한다

# 쓰기·읽기

무작위 키는 확률적으로 겹칠 수 있습니다. 후보를 다시 뽑는 것과 `UNIQUE(domain, short_key)`가 거부하는 것을 함께 써야 잘못된 목적지 연결을 막을 수 있습니다.

1입력·멱등 확인

허용 scheme와 alias를 검사하고 이전 동일 요청 결과를 돌려줍니다.

2Base62 후보

유일 ID 인코딩 또는 CSPRNG 후보 생성 뒤 고유 삽입을 시도합니다.

3상태 저장·검사

pending_scan으로 저장하고 검사·정책 판정 뒤 active로 전환합니다.

4캐시 우선 조회

cache hit에서도 status, expiry, version을 보고 redirect 여부를 결정합니다.

5비동기 계측

클릭 이벤트는 응답 뒤에 보내고 삭제·차단은 purge로 전파합니다.

04 · TRADEOFFS

리다이렉트 코드는 캐시 수명과 메서드에 관한 약속이다

# 트레이드오프

RFC 9110·9111에 따르면 301·308은 heuristic freshness를 계산할 수 있고, 302·307은 `Cache-Control`의 `max-age` 같은 명시적 정책으로 caching을 통제하는 편이 안전합니다. 301·302는 POST를 GET으로 바꿀 수 있으나 307·308은 요청 메서드를 바꾸면 안 됩니다.

선택캐시·메서드 의미장점URL 단축에서의 판단
301 Moved Permanentlyheuristic freshness 가능, POST→GET 변경 가능안정된 목적지의 반복 방문 효율목적지가 정말 고정일 때만 긴 freshness와 함께 사용
302 Found명시적 캐시 정책 권장, POST→GET 변경 가능변경·철회 가능한 링크의 보수적 시작점일반 GET 링크와 짧은 `Cache-Control`에 적합
307 Temporary Redirect명시적 캐시 정책 권장, 메서드 보존임시 이동에서도 메서드·body 보존비-GET 전달이 의도된 특수 경로만 검토
308 Permanent Redirectheuristic freshness 가능, 메서드 보존영구 이동의 명시적 메서드 보존회수 어려움이 허용되는 영구 목적지에 한정
무작위 Base62후보 충돌 가능, unique insert로 확정순번 추측을 낮춤재시도율·난수 품질·키 길이를 운영 지표로 관리
05 · FAILURE MODES

네 가지를 넘는 장애를 상태·지표·복구 검증으로 다룬다

# 장애 6가지
캐시 stampede

인기 키가 동시에 miss되어 DB와 redirect p99를 밀어 올립니다.

대응 · single-flight, stale 정책, hot-key rate limit. 피크 재현에서 DB read와 p99를 검증합니다.
#키 충돌·alias 경쟁

무작위 후보가 겹치거나 두 사용자가 같은 alias를 요청합니다.

대응 · DB unique constraint, 후보 재생성, 원자적 alias 예약. 중복 key 0건을 확인합니다.
×삭제 purge 지연

철회한 링크가 edge나 L1의 오래된 값으로 잠시 열릴 수 있습니다.

대응 · tombstone, purge 재시도, 짧은 TTL, version 검사. 모든 계층의 버전을 대조합니다.
DB/리전 장애

origin miss가 실패해 정상 링크도 리다이렉트하지 못합니다.

대응 · 다중 AZ 읽기·제한적 stale cache·쓰기 보호. failover 뒤 status/expiry 일치를 확인합니다.
!검사 공급자 지연

새 링크 판정이 늦거나 타임아웃되어 공개 여부가 불명확해집니다.

대응 · pending 유지, 재시도, 수동 검토. 검사 큐 age와 판단 감사 가능성을 검증합니다.
피싱 대량 생성

봇이 계정·도메인·IP를 바꾸며 링크와 검사 비용을 폭증시킵니다.

대응 · 단계적 rate limit, CAPTCHA, account kill switch. 우회율과 정상 오류율을 함께 봅니다.
06 · OPERATIONS

보안·관측·비용은 redirect 경로 밖에서 준비한다

# 운영
보안과 개인정보

Safe Browsing은 URL 위험 신호이고, 관리자 abuse control은 계정·도메인·IP·신고를 다루는 별도 제어 평면입니다. URL query의 토큰과 클릭 원문 로그를 최소화합니다.

allowlist · pending_scan · audit
관측 가능성

cache hit ratio, redirect p99, key collision retry, purge lag, scan queue age, blocked/expired 응답을 분리해 봅니다. 목적지 URL은 trace에 원문 대신 ID·안전한 해시를 씁니다.

purge_lag_seconds · decision_total
비용 모델

redirect 본문이 작아도 edge 요청·egress·DB miss·복제·tombstone·검사 호출·수동 검토 비용이 듭니다. hit ratio 95%→90%는 origin read를 두 배로 만듭니다.

cache miss × DB read × replica
면접 모드 · 추가 질문05:00
“하루 2억 번 열리는 URL 단축 서비스를 설계해 보세요. Base62 키 충돌을 어떻게 확정적으로 막고, 301/302/307/308은 어떤 기준으로 고르며, 이미 캐시된 위험 링크의 철회와 Safe Browsing·관리자 abuse control을 어떻게 설명하겠습니까?”
읽기:쓰기와 cacheunique insertredirect cachetombstone + purge검사와 운영 제어 분리
SOURCES

공식·1차 출처

NEXT CASE STUDY실시간 채팅 시스템 설계
EDITORIAL NOTES

작성·검토·참고 자료

콘텐츠 원칙
이 문서는 독립적으로 재작성한 한국어 학습 자료입니다. 사실과 학습용 설계 가정을 구분합니다.
최종 검토
예상 학습 시간
20분

참고 자료

사실 오류·출처 정정은 문의·정정 페이지로 알려 주세요.