텍스트 암호화·디코딩 기초 - Base64·ROT13·URL 인코딩
개발자와 비개발자 모두를 위한 Base64, ROT13, URL 인코딩의 작동 원리와 실제 사용 사례를 쉽게 설명합니다.
Q.Base64, ROT13, URL 인코딩의 차이는 무엇인가요?
세 인코딩은 목적이 다릅니다. Base64는 이진 데이터(이미지, 파일)를 텍스트로 안전하게 전송하기 위한 인코딩입니다. ROT13은 각 알파벳을 13칸 이동시키는 단순 치환 방식으로 암호화가 아닌 간단한 난독화에 사용됩니다. URL 인코딩은 URL에 사용할 수 없는 특수문자(한글 포함)를 %XX 형식으로 변환합니다.
이메일을 보냈더니 첨부 파일이 깨졌다는 연락을 받은 적이 있는가. 이메일 프로토콜(SMTP)은 원래 텍스트 전용으로 설계됐기 때문에 이진 파일을 직접 전송할 수 없다. 이 문제를 해결하기 위해 Base64가 탄생했다.
핵심 답변
세 인코딩은 목적이 다릅니다. Base64는 이진 데이터(이미지, 파일)를 텍스트로 안전하게 전송하기 위한 인코딩입니다. ROT13은 각 알파벳을 13칸 이동시키는 단순 치환 방식으로 암호화가 아닌 간단한 난독화에 사용됩니다. URL 인코딩은 URL에 사용할 수 없는 특수문자(한글 포함)를 %XX 형식으로 변환합니다.
Base64: 이진 데이터 → 텍스트 변환
Base64는 이진 데이터를 A-Z, a-z, 0-9, +, /의 64개 문자로 표현한다. 변환하면 데이터 크기가 약 33% 증가하지만, 어떤 전송 채널에서도 안전하게 이동할 수 있다.
python
import base64
# 인코딩
original = "안녕하세요"
encoded = base64.b64encode(original.encode('utf-8'))
print(encoded) # b'7JWI64WV7ZWY7IS47JqU'
# 디코딩
decoded = base64.b64decode(encoded).decode('utf-8')
print(decoded) # 안녕하세요
실제 사용처: 이메일 첨부파일, 이미지 Data URL(data:image/png;base64,...), JWT 토큰, API 인증 헤더
ROT13: 알파벳 13칸 이동
A→N, B→O, Z→M처럼 알파벳을 13칸씩 이동시킨다. 영어 알파벳이 26개이므로 동일 함수를 두 번 적용하면 원문이 복원된다.
python
import codecs
encoded = codecs.encode("Hello World", 'rot_13') # Uryyb Jbeyq
decoded = codecs.encode(encoded, 'rot_13') # Hello World
실제 사용처: 스포일러 숨기기, 퍼즐·게임, 초간단 난독화 (보안 목적은 부적합)
URL 인코딩: 특수문자 → %XX
URL은 A-Z, a-z, 0-9, -, _, ., ~ 외 문자를 직접 포함할 수 없다. 한글, 공백, &, =, ? 등은 모두 %XX 형식으로 변환된다.
python
from urllib.parse import quote, unquote
encoded = quote("안녕 세계!") # %EC%95%88%EB%85%95%20%EC%84%B8%EA%B3%84%21
decoded = unquote(encoded) # 안녕 세계!
공백은 %20 또는 +로 표현되는데, 폼 제출(application/x-www-form-urlencoded)에서는 +를 쓰고, URL 경로에서는 %20을 쓰는 것이 표준이다.
실무 활용 사례
사례 1: API 개발에서 Base64 활용
백엔드 API가 이미지를 JSON 응답에 포함해야 할 때, 이미지 파일을 Base64로 인코딩해 data:image/png;base64,... 형식으로 전달하면 별도 파일 서버 없이 텍스트 기반 API 응답에 이미지를 포함시킬 수 있다. 단, Base64는 원본 대비 약 33% 크기가 증가하므로 대용량 이미지에는 CDN URL 방식이 더 효율적이다.
사례 2: 링크 공유 시 URL 인코딩 오류 방지
한국어 블로그 포스트 URL에 한글 제목이 포함된 경우, 슬랙이나 이메일에서 링크가 깨지는 문제가 자주 발생한다. urllib.parse.quote() 함수로 한글 경로를 미리 인코딩하면 어떤 채널에서도 링크가 정상 작동한다. 반대로 이미 인코딩된 URL을 사람이 읽을 수 있도록 unquote()로 디코딩하면 경로 파악이 쉬워진다.
사례 3: 스포일러 콘텐츠 숨기기 (ROT13)
커뮤니티 게시판에서 영화 결말이나 게임 공략을 ROT13으로 인코딩해 올리면, 보고 싶은 사람만 디코딩해 읽을 수 있다. ROT13은 보안용이 아니므로 단순 스포일러 차단이나 퀴즈 정답 숨기기 목적으로만 적합하다.
마무리
이 글에서 정리한 기준을 실제 작업에 적용할 때는 [텍스터브 글자수 세기](/tools/char-counter/) 도구로 분량을 직접 확인하면서 진행하면 더 정확하게 맞출 수 있다.