대규모 시스템 설계 기초 - url 단축기 설계 리뷰
가상 면접 사례로 배우는 대규모 시스템 설계 기초에서 읽은 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의 트래픽을 추척할 수 있습니다