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