인코딩과 해시, 왜 알아야 할까?
웹 개발, API 연동, 보안 구현 등 개발 업무에서 인코딩과 해시는 매일 마주치는 개념입니다. 인코딩은 데이터를 다른 형식으로 변환하는 것이고, 해시는 데이터를 고정 길이의 값으로 변환하는 것입니다. 둘 다 "변환"이지만 목적과 특성이 전혀 다릅니다.
인코딩 vs 해시 비교
| 구분 | 인코딩 | 해시 |
| 목적 | 데이터 호환성, 전송 | 무결성 검증, 보안 |
| 복원 가능 | 가능 (디코딩) | 불가능 (단방향) |
| 키 필요 | 불필요 | 불필요 (HMAC 제외) |
| 출력 길이 | 입력에 비례 | 항상 고정 |
| 예시 | Base64, URL 인코딩 | MD5, SHA-256 |
Base64 인코딩
바이너리 데이터를 ASCII 문자(A-Z, a-z, 0-9, +, /)로 변환합니다. 이메일 첨부파일, 이미지 Data URL, JWT 토큰 등에 사용됩니다.
원본: Hello, World!
Base64: SGVsbG8sIFdvcmxkIQ==
- 원본 대비 약 33% 크기 증가 (3바이트 → 4문자)
- 패딩 문자(=)로 길이를 4의 배수로 맞춤
- 주의: 암호화가 아님! 누구나 디코딩 가능
🔐
해시 생성기
MD5, SHA-1, SHA-256 해시 즉시 생성
→
URL 인코딩 (Percent Encoding)
URL에서 사용할 수 없는 문자를 %XX 형식으로 변환합니다.
원본: 안녕하세요
URL 인코딩: %EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94
공백: Hello World → Hello%20World
특수문자: a&b=c → a%26b%3Dc
API 호출 시 쿼리 파라미터에 한글이나 특수문자가 포함되면 반드시 URL 인코딩해야 합니다.
문자 인코딩: UTF-8의 중요성
전 세계 웹 페이지의 약 98%가 UTF-8을 사용합니다.
| 인코딩 | 영문 크기 | 한글 크기 | 지원 문자 |
| ASCII | 1바이트 | 미지원 | 128자 |
| EUC-KR | 1바이트 | 2바이트 | 한/영/일 일부 |
| UTF-8 | 1바이트 | 3바이트 | 전 세계 모든 문자 |
| UTF-16 | 2바이트 | 2바이트 | 전 세계 모든 문자 |
한글 "가"의 UTF-8 바이트는 0xEA 0xB0 0x80 (3바이트)입니다. 데이터베이스, 파일, API 모두 UTF-8로 통일하는 것이 깨짐을 방지합니다.
주요 해시 함수 비교
| 해시 | 출력 길이 | 속도 | 보안성 | 용도 |
| MD5 | 128비트(32자) | 매우 빠름 | 취약 ❌ | 체크섬(파일 검증) |
| SHA-1 | 160비트(40자) | 빠름 | 취약 ❌ | 레거시, Git |
| SHA-256 | 256비트(64자) | 보통 | 안전 ✅ | 디지털 서명, 블록체인 |
| SHA-512 | 512비트(128자) | 보통 | 안전 ✅ | 고보안 요구 |
| bcrypt | 184비트 | 느림(의도적) | 안전 ✅ | 비밀번호 저장 |
비밀번호 저장에는 bcrypt, scrypt, Argon2를 사용하세요. MD5/SHA는 속도가 빨라 무차별 대입 공격에 취약합니다.
📋
JSON 포맷터
JSON 정리, 검증, 변환 도구
→
실무 활용 팁
- JWT 토큰: Header.Payload.Signature 구조에서 각 부분이 Base64Url 인코딩됩니다.
- 파일 무결성: 다운로드한 파일의 SHA-256 체크섬을 공식 사이트와 비교하세요.
- API 키: 절대 해시 대신 원본을 전송하지 마세요. HMAC-SHA256으로 서명하세요.
- 데이터베이스: CHAR SET을 utf8mb4로 설정해야 이모지도 저장할 수 있습니다.
- Git: 커밋 ID는 SHA-1 해시입니다. Git은 SHA-256으로 전환 중입니다.