Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 구현하는 URL 단축기: 인코딩·디코딩 알고리즘 완벽 가이드

bit.ly나 tinyurl 같은 URL 단축 서비스를 자주 접하게 됩니다. 이런 서비스는 길이가 긴 원본 URL을 받아 일종의 변환(암호화) 알고리즘을 적용한 뒤 훨씬 짧은 URL을 반환합니다. 그리고 사용자가 단축된 URL에 접속하면 역으로 복호화 알고리즘을 실행해 원래의 긴 URL로 되돌린 후 해당 링크를 열어주죠.

이번 글에서는 바로 이 작업을 JavaScript로 직접 구현해 보겠습니다. 구현해야 할 함수는 두 가지입니다.

  • encrypt() — 원본 URL을 입력받아 고유하고 짧은 단축 URL을 반환합니다.
  • decrypt() — 단축 URL을 입력받아 원본 URL에 대한 사전 정보 없이도 원래 주소로 되돌려줍니다.

구현 방법

여기서는 Node.js에서 기본 제공되는 Buffer 객체를 활용해 Base64 인코딩 방식으로 문제를 해결합니다. 원본 문자열을 Base64로 인코딩하면 단축 URL의 고유 식별자로 사용할 수 있고, 다시 디코딩하면 원본을 그대로 복원할 수 있기 때문입니다.

const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript';

const encrypt = (longUrl) => {
    const encodedUrl = Buffer.from(longUrl, 'binary').toString('base64');
    return "https://mydemo.com/" + encodedUrl;
};

const decrypt = function(shortUrl) {
    let encodedUrl = shortUrl.split('mydemo.com/')[1];
    return Buffer.from(encodedUrl, 'base64').toString();
};

const encrypted = encrypt(url);
const decrypted = decrypt(encrypted);

console.log(encrypted);
console.log(decrypted);

실행 결과

위 코드를 콘솔에서 실행하면 다음과 같은 출력을 확인할 수 있습니다.

https://mydemo.com/aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdA==
https://developer.mozilla.org/en-US/docs/Web/JavaScript

코드 동작 원리 살펴보기

1. encrypt() — 인코딩 과정

Buffer.from(longUrl, 'binary')는 원본 URL 문자열을 바이너리 데이터로 변환합니다. 이어서 .toString('base64')를 호출하면 해당 데이터가 Base64 형식의 문자열로 인코딩됩니다. 마지막으로 도메인 접두사인 https://mydemo.com/를 앞에 붙여 완전한 단축 URL 형태를 만들어 반환합니다.

2. decrypt() — 디코딩 과정

단축 URL이 들어오면 split('mydemo.com/')[1]을 통해 도메인 부분을 잘라내고 순수한 Base64 인코딩 값만 추출합니다. 그다음 Buffer.from(encodedUrl, 'base64')로 Base64 문자열을 버퍼로 되돌리고, .toString()을 호출하면 원본 URL이 그대로 복원됩니다.

참고 사항

Base64 인코딩은 간단하고 양방향 변환이 가능하지만, 실제 프로덕션 환경의 URL 단축 서비스에서는 보통 데이터베이스에 원본 URL을 저장하고 고유 ID(예: 62진법 해시)를 발급하는 방식을 사용합니다. 또한 Base64 결과물에는 +, /, = 같은 문자가 포함될 수 있어 URL 경로로 사용하기 어렵기 때문에, 실무에서는 URL-safe Base64(Base64URL) 변환을 함께 적용하는 것이 좋습니다.