가상 면접 사례로 배우는 대규모 시스템 설계 기초에서 읽은 url 단축기에 대해 정리합니다.

문자 메시지에 url을 포함하여 문자를 발송할때 꼭 필요한 기능이라고 말할수 있습니다.

LMS를 보내면 간편하겠지만 LMS 비용은 1건에 25원 정도로 파악됩니다. 기준 SMS 가격은 8~12원 이며 한글 45자, 영문자 90자로 제한되어 있어 내용을 줄일 수 있다면 최대한 줄여 sms를 보내는것이 비용면에서 엄청난 절감 효과가 있습니다

메신저 카카오톡, 라인을 사용한다면 url 길이 상관없이 보낼 수 있습니다. 그럼에도 url 단축 서비스를 사용하여 메시지의 가독성을 높이고 쿼리스트링 노출을 최소화 하는것이 좋다고 생각합니다.

책에서 제시한 두가지 방법

해시후 충돌 해소

CRC32, MD5, SHA-1 함수를 사용하여 https://en.wikipedia.org/wiki/systems_design 을 축약한 결과는 아래와 같습니다.

해시함수 결과
CRC32 5cb54054
MD5 5a62609a94df9ee03fe1230b9df8b84e
SHA-1 0eeae7916c06853901d9ccbefbfcaf4de57ed85b

CRC32를 사용한 결과 8글자로 길이가 가장 짧습니다. 8글자 보다 더 짧게 구성해야 한다면 앞에서 7글자만 사용해야 할 것입니다. 단축 url 생성 과정을 정리하자면 다음과 같습니다.

  • url을 CRC32 함수를 사용하여 해시값을 구하고 db에 저장된 값인지 확인합니다.
  • db에 있다면 prefix 를 추가하여 중복을 방지합니다.
  • db에 없다면 해시값을 저장합니다.
  • 중복이 해소되어 저장될 때 까지 반복합니다.

base62 변환

url 변환시 정수형 id를 할당 받고 정수형 id 값을 62진수로 변환하는 방법입니다. 0-9, a-z, A-Z 문자 62개를 사용하여 62진수로 변환하는 것입니다. 62진수 변환을 7글만 사용해도 3.5조 만큼의 단축 url을 생성 할 수 있습니다.

글자수 저장 가능 개수
2 $ 6^2 = 3844 $
3 $ 6^3 = 238,328 $
4 $ 6^4 = 14,776,336 $
5 $ 6^5 = 916,132,832 $
6 $ 6^6 = 56,800,235,584 $
7 $ 6^7 = 3,521,614,606,208 $

base62를 사용한 단축 url 생성 과정은 다음과 같습니다.

  • url 단축 요청시 정수형 id 를 할당 받습니다.
  • 할당 받은 id를 62진수로 변환 합니다.
  • 변환 한 62진수 값을 저장하고 반환합니다.

비교

해시 후 충돌 해소 base62
단축 url 길이가 고정됨 단축 url 길이가 가변적, id 값이 커짐에 따라 길이기 증가
unique한 정수형 id 생성기가 필요하지 않음 unique한 정수 id 생성이 보장 되어야 함
해시 함수로 url 자체를 변환 하기에 예측 불가능 정수형 id 값을 62진수로 변환 하기에 예측 가능

위 비교에서 base62의 내용을 보충할 수 있습니다.

  • base62 사용시 단축 Url 길이가 가변적이라는 문제는 padding을 추가하여 해결 가능할 것으로 생각됩니다.
  • 0-9, a-z, A-Z 를 무작위로 섞어 예측의 난이도를 높일 수 있습니다.

Redirect 정리

301 응답

영구적으로 url이 이전되었다는 응답으로 브라우저는 이 응답을 cache에 저장합니다. 서버의 부하를 줄이는게 목적이라면 301을 사용해야 합니다.

302 응답

일시적으로 url이 이전되었다는 응답으로 캐시 하지 않습니다. 302을 사용하여 단축 url의 트래픽을 추척할 수 있습니다