https://www.example.com/q=chatsystem&c=loggedin&v=3&l=long이라고 입력이 주어진 경우https://www.tinyurl.com/y7ke-ocwj와 같은 단축 URL을 결과로 제공해야 함| 구분 | 301 Moved Permanently | 302 Found (또는 Moved Temporarily) |
|---|---|---|
| 의미 | 영구적인 리디렉션 (URL이 완전히 변경됨) | 임시적인 리디렉션 (일시적으로 다른 URL로 이동) |
| 용도 | 사이트 이전, 구조 변경, 영구 URL 교체 등 | 트래킹, 테스트, 로그인 후 리디렉션 등 |
| 브라우저 동작 | 응답을 캐싱 이후 요청에서도 새 URL로 직접 접근 | 원래 URL로 계속 요청함 (서버가 계속 리디렉션 지시) |
| 검색엔진 처리(SEO) | 링크 가치(Link juice)를 새 URL로 이전 | 링크 가치 유지되지 않음 (임시로 간주) |
| 캐싱 | 캐시될 수 있음 (영구이므로) | 일반적으로 캐시하지 않음 |
| HTTP 응답 코드 | 301 Moved Permanently | 302 Found (이전엔 “Moved Temporarily”) |
| Location 헤더 | 새 URL을 지정 (필수) | 새 URL을 지정 (필수) |
| 브라우저 히스토리 영향 | 새 URL로 교체될 수 있음 | 원래 URL 유지 |
| 주요 사용 사례 | 도메인 변경, HTTPS 전환, 슬러그 변경 | 로그인/세션 리디렉션, A/B 테스트, 추적 URL |
원래 URL = hashTable.get(단축 URL)
301 또는 302 응답 Location 헤더에 원래 URL을 넣은 후 전송
www.tinyurl.com/{hashValue}와 같은 형태일 때,
| 알고리즘 | 해시 길이 | 특징 | 단축 URL 관점 |
|---|---|---|---|
| CRC32 | 32bit (약 4.3×10⁹개 경우) | 매우 빠름, 단순 체크용 | 빠르지만 충돌 확률 높음 |
| MD5 | 128bit | 균등 분포, 널리 사용 | 속도와 품질 균형 좋음 |
| SHA-1 | 160bit | 충돌 매우 희박, 보안성 높음 | 단축 URL엔 다소 과하지만 안정적 |
hash("https://example.com/a") → "A7xPqL2"
이미 존재함 → 충돌 발생!
hash("https://example.com/a" + "1") → "bK0RzTf"
새 키 확보 hashValue에 사용할 수 있는 문자 수가 62개이기 때문에 base62 변환
문자 매핑 가능
| 값 | 문자 | 값 | 문자 | 값 | 문자 |
|---|---|---|---|---|---|
| 0–9 | '0'–'9' | 10–35 | 'A'–'Z' | 36–61 | 'a'–'z' |
base-62 변환 원리
| 하하하 | 해시 후 충돌 해소 | base-62 |
|---|---|---|
| 단축 URL의 길이 | 고정 | 가변적. ID 값이 커지면 같이 길어짐 |
| 유일성이 보장되는 ID 생성기 | 필요 없음 | 필요 |
| 충돌 여부 | 충돌 가능. 해소 필요 | ID의 유일성이 보장된 적용가능하기 떄문에 충돌 자체가 불가능 |
| 단축 URL 예측 가능 여부 | 불가능 | ID가 1씩 증가하는 값이라고 가정한다면 다음에 쓸 수 있는 URL 유추 가능 |