URL 단축키 설계

bw1611·2024년 2월 20일

API 엔드포인트, URL 리디렉션, URL 단축 플로에 대해서 알아보도록 하겠다.

API 엔드포인트

클라이언트는 서버가 제공하는 API 엔드포인트를 통해 서버와 통신한다.

1, URL 단축용 엔드포인트 : 새 단축 URL을 생성하고자 하는 클라이언트는 URL을 인자로 실어서POST 요청을 보내야 한다.

POST api/v1/data/shorten

2, URL 리디렉션용 엔드포인트 : 단축 URL에 대해서 HTTP 요청이 원래 URL로 보내주기위한 용도의 엔드포인트

GET /api/v1/shortUrl

URL 리디렉션

Request URL로 리디렉션 URL을 넣어준다면 단축 URL을 받은 서버는 그 URL을 원래 URL로 바꾸어서 301 응답을 Location header에 넣어 반환한다.

응답 코드 301 : URL에 대한 HTTP 요청의 처리 책임이 영구적으로 Location header에 반한된 URL로 이전되었다는 응답이다.

응답 코드 302 : 이 응답은 주어진 URL로 요청이 일시적으로 Location header가 지정하는 URL에 의해 처리되어야 한다는 응답이다. 클라이언트의 요청은 언제나 단축 URL 서버에 먼저 보내진 후에 원래 URL로 리디렉션되어야 한다.
서버의 부하를 줄이는 것이 중요하다면 301를 사용하는 것이 좋고 302 found는 트래픽 분석이 중요할 경우 많이 사용된다.
URL 리디렉션을 구현하는 가장 직관적인 방법은 해시 테이블 사용하는 것이다.

원래 URL = hashTable.get(단축 URL)

URL 단축

단축 URl이 .com/{hashValue} 같은 형태라고 생각한다면 중요한 것은 긴 URL을 이 해시 값으로 대응시킬 해시 함수 fx를 찾는 일이 될것이다.

  • 입력으로 주어진 긴 URL이 다른 값이면 해시도 달라져야 한다.
  • 계산된 해시 값은 원래 입력으로 주어졌던 긴 URL로 복원될 수 있어야 한다.

하지만 실제 시스템에서는 해시 테이블을 사용하기 곤란할 수 있다. 메모리는 유한한 데다 비싸기 때문이다. 더 나은 방법은 단축URL, 원래 URL의 순서쌍을 관계형 데이터베이스에 저장하는 것이다.

해시 후 충돌 해소

긴 URL을 줄이려면, 원래 URL을 7글자 문자열로 줄이는 해시 함수가 필요한데 손쉬운 방법은 MD5, SHA-1 같이 잘 알려진 해시함수를 이용하면 된다. 하지만 해시 값을 이용해도 7글자를 넘기기 마련이다. 이걸 방지하기 위해서는 처음 7개 글자만 이용하여 해시 값을 형성해준다. 하지만 서로 충돌 확률이 높아지기 때문에 충돌이 해소될 때까지 사전에 정한 문자열을 해시값에 덧붙여서 해결하도록 한다.

base-62 변환

진법 변환은 URL 단축키를 구현할 때 흔히 사용되는 정근법 중 하나다. 62진법을 쓰는 이유는 hashValue에 사용할 수 있는 문자 개수가 62개이기 때문이다.

URL 단축기 상세 설계

URL 단축기는 시스템의 핵심 컴포넌트이므로, 그 처리 흐름이 논리적으로 단숙해야 하고 기능적으로 언제나 동작하는 상태로 유지되어야 한다.

profile
Java BackEnd Developer

0개의 댓글