8. URL 단축기

💬 URL 단축기

  • 긴 문자열 형태인 URL을 단축된 형태로 변형하고, 단축된 URL을 통해 원본 URL로 접속할 수 있도록 한다.

  • 수많은 URL 단축 요청을 처리할 수 있어야 한다.

💬 컴포넌트

API 엔드포인트

  • 두 개의 엔드포인트로 구성된다.

    • 단축 URL 생성을 위한 엔드포인트로 원본 URL을 입력받아 단축된 URL을 생성해 반환한다.

    • 단축된 URL을 원본 URL로 리다이렉트해주기 위한 엔드포인트로, 단축 URL을 입력받아 원본 URL을 반환한다.

  • 단축 URL을 입력받은 서버는 HTTP 301 Permanently Moved 혹은 HTTP 302 Found 응답을 반환한다.

  • HTTP 301 Permanently Moved: 영구적으로 location 헤더의 URL을 사용하라는 의미이므로, 브라우저는 이동된 URL를 캐시하여 같은 URL로 요청이 들어왔을 때 캐시된 URL로 요청을 보낸다. URL 단축기 서버의 부하가 줄어든다.

  • HTTP 302 Found : 일시적으로 location 헤더의 URL을 사용하라는 의미이므로, 항상 단축 URL에 요청이 보내졌다가 원래 URL로 리다이렉트된다. 트래픽 분석이 중요한 경우 유용하다. (얼마나 링크가 클릭되었는지, 언제 클릭되었는지에 대한 트래픽 정보는 중요하게 사용될 수 있다.)

URL 단축

URL을 해싱할 함수의 동작

  • 입력이 다르면 해싱 값도 달라야 한다.

  • 해시 값은 원래 입력으로 주어졌던 긴 URL로 복원될 수 있어야 한다.

해시 값 길이 정하기

  • 해시된 값에 숫자와 영어 소문자/대문자만 포함될 수 있다면, 한 글자에 62 종류가 들어올 수 있다.

  • 따라서 62 ^ (해시 값 길이) 만큼의 URL을 만들 수 있다.

  • 해시 값 길이가 7만 되어도 거의 3.5조개의 URL을 생성할 수 있게 된다.

해시 함수 구현

  • 널리 알려진 CRC32, MD5, SHA-1 등을 사용하는 경우 해시 값 길이는 7글자를 무조건 넘게 된다.

  • 해시 값 길이를 짧게 유지하기 위해서는 다음 방식을 도입할 수 있다.

    • 해시 후 충돌 해소

      • 원본 URL을 해싱하여 맨 앞 7글자만 남긴 후, 이미 해당 해시에 매핑된 URL이 있는지 확인한다.

      • 만약 매핑된 URL이 없다면 그대로 DB에 저장한다.

      • 매핑된 URL이 이미 있다면, 원본 URL에 특정 문자열을 덧붙인 후 다시 해싱하여 맨 앞 7글자만 남긴다.

      • 이 과정을 충돌이 해소될 때 까지 반복한다.

      • 매핑된 URL을 확인하기 위해 데이터베이스 대신 블룸 필터를 사용하면 성능을 높일 수 있다.

    • base-62 변환

      • 진법을 변환하면 수의 표현 방식이 다른 시스템들 간에 같은 수를 공유하기 용이하다.

      • 62진법을 사용하는 이유는 숫자, 영문 대소문자의 총 개수가 62개이기 때문이다. (0~9~a~z~A~Z)

      • URL에 대한 유일한 ID를 생성한 후, 해당 ID를 62진수로 변환해 단축 URL에 사용하는 방식이다.

      • 유일한 ID를 단순히 짧게 만드는 것이므로 충돌 위험이 없다.

      • 다음에 쓸 단축 URL을 쉽게 예측할 수 있으므로 보안 상 문제가 될 수 있다.

URL 리디렉션

  • 로드밸런서는 엔트포인트 역할을 하여 요청을 받았을 때 원본 URL으로 리다이렉트해준다.

  • 원본 URL은 데이터베이스로부터 얻거나, 캐시로부터 얻을 수 있다.

Last updated