텍스트 암호화·디코딩 기초 - Base64·ROT13·URL 인코딩
개발자와 비개발자 모두를 위한 Base64, ROT13, URL 인코딩의 작동 원리와 실제 사용 사례를 쉽게 설명합니다.
Q.Base64, ROT13, URL 인코딩의 차이는 무엇인가요?
세 인코딩은 목적이 다릅니다. Base64는 이진 데이터(이미지, 파일)를 텍스트로 안전하게 전송하기 위한 인코딩입니다. ROT13은 각 알파벳을 13칸 이동시키는 단순 치환 방식으로 암호화가 아닌 간단한 난독화에 사용됩니다. URL 인코딩은 URL에 사용할 수 없는 특수문자(한글 포함)를 %XX 형식으로 변환합니다.
이메일을 보냈더니 첨부 파일이 깨졌다는 연락을 받은 적이 있는가. 이메일 프로토콜(SMTP)은 원래 텍스트 전용으로 설계됐기 때문에 이진 파일을 직접 전송할 수 없다. 이 문제를 해결하기 위해 Base64가 탄생했다.
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을 쓰는 것이 표준이다.
---
이 글은 AI가 공개 자료를 기반으로 작성했습니다. ROT13은 보안 목적으로 사용하기에 매우 취약한 방식입니다.