한양과학기술고등학교

에듀테크 프로젝트 대시보드

URL 단축 서비스

📎 원리 개요 해시 vs 카운터
https://offset0xf.com/very/long/path?x=1 같은 긴 URL을 https://0xf.ly/aB3 처럼 짧은 코드로 바꾸고, 코드로 접속하면 원래 주소로 302 리다이렉트하는 서비스입니다. 짧은 코드를 만드는 방법은 크게 두 가지입니다.
방식원리문제점
해시 기반 MD5/SHA 해시 앞 6~7자 사용 해시 충돌 시 재시도 필요
카운터 기반 DB auto-increment ID를 Base62로 변환 충돌 없음, ID만큼만 짧아짐
실무에서는 카운터 기반이 더 널리 쓰입니다 — 새 URL마다 1씩 증가하는 정수 ID를 발급받고, 그 숫자를 사람이 읽기 좋은 문자열로 압축하기만 하면 되기 때문입니다. 아래 두 패널에서 그 압축 방법(Base62)과 실제 서버 코드를 확인해보세요.
🔢 Base62 인코딩 단계별 계산
알파벳 표 (62자)
🐍 FastAPI 서버 코드 main.py
# 62진법 알파벳: 0-9, a-z, A-Z BASE62 = ( "0123456789abcdefghijkl" "mnopqrstuvwxyzABCDEFG" "HIJKLMNOPQRSTUVWXYZ" ) def encode(num: int) -> str: if num == 0: return BASE62[0] chars = [] while num > 0: num, rem = divmod(num, 62) chars.append(BASE62[rem]) return "".join(reversed(chars)) # DB의 PK(auto-increment)가 곧 카운터 역할 @app.post("/api/shorten") async def shorten(url: HttpUrl): row = await db.insert(long_url=str(url)) code = encode(row.id) # 예: 1000 → "g8" return {"short_url": f"https://0xf.ly/{code}"} @app.get("/{code}") async def redirect(code: str): original = await db.find_by_code(code) if not original: raise HTTPException(404) return RedirectResponse(original, status_code=302)
✂️ 라이브 단축기 시뮬레이션
코드원본 URL방문
📐 용량 계산기 62ⁿ
코드 길이를 바꾸면 만들 수 있는 전체 조합 수(용량)가 어떻게 늘어나는지 확인해보세요.
62⁶ = 56,800,235,584개
길이조합 수비교
4자14,776,336서울 인구의 약 1.5배
6자568억지구 인구의 약 7배
8자218조거의 무한대에 가까움
🤔 왜 하필 Base62?
진법사용 문자URL에서
Base160-9, a-f안전하지만 길어짐
Base360-9, a-z안전, 대소문자 구분 없음
Base620-9, a-z, A-Z안전 + 대소문자 활용 → 최단
Base64Base62 + + /+,/는 URL에서 특수 의미(escape 필요)
Base64는 +, /, = 를 포함해 URL에 그대로 쓰면 퍼센트 인코딩이 필요해집니다. Base62는 영문 대소문자 + 숫자만 쓰기 때문에 어떤 URL에도 이스케이프 없이 안전하게 들어가면서도, Base36보다 26배(대문자만큼) 더 조밀하게 압축됩니다.