들어가며

매일 수백만 명의 사람들이 lix.li/a1B2c3 같은 짧은 링크를 클릭하지만, 클릭 후 페이지가 열리기까지 그 사이에 무슨 일이 일어나는지 생각해보는 사람은 거의 없습니다. 사실 그 찰나의 순간에는 꽤 많은 일이 벌어집니다. 서버는 즉시 올바른 원본 URL을 찾아내야 하고, 브라우저를 리디렉션해야 하며, 클릭 데이터를 기록해야 합니다. 이 모든 과정이 밀리초 단위로 이루어집니다. 이 글에서는 URL 단축기가 내부적으로 어떻게 작동하는지 살펴봅니다. 어떤 기술이 사용되는지, 짧은 코드는 어떻게 생성되는지, 분석 데이터는 어디서 오는지, 그리고 왜 이 기술이 겉보기보다 훨씬 복잡한지 알아보겠습니다.

URL 단축기란 무엇인가

URL 단축기는 긴 URL(예: https://example.com/products/category/electronics/smartphones?ref=newsletter&utm_campaign=summer2026)을 lix.li/xY7z9Q처럼 짧은 링크로 바꿔주는 서비스입니다. 사용자가 짧은 링크를 클릭하면 자동으로 원래의 긴 주소로 이동됩니다. 간단해 보이지만, 그 뒤에는 완전한 인프라가 존재합니다. 데이터베이스, 고유 식별자를 생성하는 알고리즘, 리디렉션 시스템, 그리고 분석 엔진까지 모두 필요합니다.

핵심 메커니즘: HTTP 리디렉션

모든 URL 단축기의 핵심에는 HTTP 리디렉션이 있습니다. 이는 웹 프로토콜의 표준 메커니즘으로, 브라우저에게 "찾으시는 콘텐츠는 다른 주소에 있습니다"라고 알려주는 역할을 합니다. 누군가 짧은 링크를 클릭하면 다음과 같은 과정이 일어납니다.

  1. 브라우저가 단축 서비스의 서버로 요청을 보냅니다 (예: lix.li/xY7z9Q).
  2. 서버는 데이터베이스에서 코드 xY7z9Q에 해당하는 긴 URL을 찾습니다.
  3. 서버는 원본 URL을 가리키는 Location 헤더와 함께 301 또는 302 HTTP 상태 코드로 응답합니다.
  4. 브라우저는 자동으로 긴 URL에 새 요청을 보내고 목적지 페이지를 불러옵니다. 이 모든 과정은 밀리초 단위로 이루어지며, 사용자는 이를 전혀 눈치채지 못합니다.

301과 302의 차이

리디렉션 상태 코드를 선택하는 것은 브라우저와 검색 엔진의 동작에 영향을 미치는 중요한 기술적 결정입니다.

  • 301(영구 이동) — 영구적인 리디렉션입니다. 브라우저와 검색 엔진은 이를 캐시에 저장하며, 이후에는 최종 목적지 주소로 직접 요청을 보낼 수도 있습니다. 이는 단축 서비스 서버의 부하를 다소 줄여주지만, 반복 방문이 서버를 거치지 않을 수 있어 정확한 클릭 추적이 어려워질 수 있습니다.
  • 302(임시 이동) — 임시 리디렉션입니다. 모든 클릭이 반드시 단축 서비스 서버를 거치도록 하여 완전하고 정확한 클릭 추적을 가능하게 합니다. 이런 이유로 Lix.li를 포함한 대부분의 분석 중심 서비스들이 302를 사용합니다.

짧은 코드는 어떻게 생성되는가

가장 흥미로운 엔지니어링 과제 중 하나는 수백만 개의 링크에 대해 짧고, 고유하며, 충돌하지 않는 코드를 생성하는 방법입니다. 여기에는 몇 가지 일반적인 접근 방식이 있습니다.

1. base62 인코딩을 활용한 순차 카운터

가장 널리 사용되는 방법 중 하나입니다. 새로운 링크가 생성될 때마다 데이터베이스의 자동 증가 카운터로부터 순차 번호(1, 2, 3…)가 부여됩니다. 이 숫자는 10진수에서 base62로 변환됩니다. base62는 a–z, A–Z, 0–9, 총 62개의 문자를 사용하는 진법 체계입니다. 왜 62개의 문자를 사용할까요? 모두 URL에 안전하게 사용할 수 있으며 결과값이 매우 간결해지기 때문입니다. 예를 들어 125,000이라는 숫자는 base62로 변환하면 단 4자리가 됩니다. 이렇게 하면 코드가 짧게 유지되면서도 카운터가 증가함에 따라 예측 가능한 방식으로 늘어납니다.

2. 해싱

또 다른 방법은 원본 URL의 해시값(예: MD5 또는 SHA-256)을 계산한 뒤, 해당 해시값의 앞부분 몇 글자를 짧은 코드로 사용하는 것입니다. 이 방법은 중앙 집중식 카운터가 필요 없다는 편리함이 있지만, 서로 다른 URL이 동일한 해시 접두어를 생성하는 충돌 위험이 있어 이를 처리하기 위한 추가적인 로직이 필요합니다.

3. 고유성 확인을 거친 무작위 생성

서비스가 고정된 길이(보통 6~8자)의 무작위 문자열을 생성한 뒤, 데이터베이스에서 해당 코드가 이미 사용 중인지 확인합니다. 이미 사용 중이라면 새로 생성합니다. 이 방식은 구현이 가장 간단하지만, 링크 수가 늘어날수록 충돌 가능성도 함께 높아지므로 효율적인 데이터베이스 인덱싱이 중요합니다.

4. 커스텀 별칭

Lix.li를 포함한 많은 서비스들은 자동 생성된 코드 대신 사용자가 직접 짧은 코드를 지정할 수 있도록 허용합니다. 예를 들어 무작위 문자열 대신 lix.li/summer-sale 같은 코드를 사용할 수 있습니다. 이는 기억하기 쉬운 링크가 중요한 마케팅 캠페인에서 특히 유용합니다.

데이터베이스 구조

모든 URL 단축기의 핵심에는 간단하지만 매우 중요한 매핑 테이블이