암호화 · 해시 · TLS 실전
대칭(AES) · 비대칭(RSA/ECDSA) · 해시(SHA/bcrypt) · TLS 1.3 핸드셰이크 — 알고 쓰자.
ch16-4에서 해시 vs 암호화 개념은 봤다. 여기선 "뭘 언제 쓰나"를 실전 기준으로 정리. Claude가 만든 암호화 코드가 맞는지 볼 수 있다.
암호화 세 축. ① 대칭(같은 키로 암호·복호) — AES. 빠르지만 키 공유 문제. ② 비대칭(공개키로 암호, 개인키로 복호) — RSA·ECDSA. 느리지만 키 공유 문제 해결. ③ 하이브리드 — 비대칭으로 세션키 교환 후 대칭으로 대량 전송. TLS가 이 방식.
| 알고리즘 | 종류 | 특징 | 쓰는 곳 |
|---|---|---|---|
| AES-256-GCM | 대칭 | 빠름 + 인증 태그(무결성) | 파일 암호화, DB 필드 |
| ChaCha20-Poly1305 | 대칭 | 모바일·저사양에 빠름 | TLS 1.3, WireGuard |
| RSA | 비대칭 | 2048~4096비트, 느림 | 옛 TLS, 서명 |
| ECDSA / Ed25519 | 비대칭 | 짧고 빠름 | 현대 TLS 인증서, SSH 키 |
| SHA-256 | 해시 | 빠름, 무결성 | 파일 지문, Git 커밋 |
| bcrypt / argon2 | 느린 해시 | 비밀번호 전용 | 로그인 저장 |
import crypto from "node:crypto";
// ━━━ 1) 대칭 암호화 (AES-256-GCM) — 민감 DB 필드·파일 ━━━
function encrypt(plain: string, key: Buffer) {
const iv = crypto.randomBytes(12); // IV는 매번 랜덤
const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
const enc = Buffer.concat([cipher.update(plain, "utf8"), cipher.final()]);
const tag = cipher.getAuthTag(); // 무결성 태그
return Buffer.concat([iv, tag, enc]).toString("base64");
}
function decrypt(b64: string, key: Buffer) {
const buf = Buffer.from(b64, "base64");
const iv = buf.subarray(0, 12);
const tag = buf.subarray(12, 28);
const enc = buf.subarray(28);
const d = crypto.createDecipheriv("aes-256-gcm", key, iv);
d.setAuthTag(tag);
return Buffer.concat([d.update(enc), d.final()]).toString("utf8");
}
// ━━━ 2) 해시 (파일 무결성) ━━━
const sig = crypto.createHash("sha256").update(fileBuffer).digest("hex");
// ━━━ 3) HMAC (메시지 인증 — 시크릿 키로 서명) ━━━
const mac = crypto.createHmac("sha256", secret).update(payload).digest("hex");
// 웹훅 검증, JWT 서명에 사용
// ━━━ 4) 비대칭 키 쌍 생성 + 서명 ━━━
const { publicKey, privateKey } = crypto.generateKeyPairSync("ed25519");
const signature = crypto.sign(null, Buffer.from("hello"), privateKey);
const ok = crypto.verify(null, Buffer.from("hello"), publicKey, signature);Claude가 만든 crypto 코드에서 `aes-256-cbc`만 쓰고 인증 태그가 없으면 GCM으로 교체 요청. CBC는 무결성 없어서 비트 플리핑 공격 가능.
키 관리가 알고리즘보다 중요. AES-256도 키가 Git 저장소에 있으면 무용지물. 운영 환경에선 AWS KMS · HashiCorp Vault · 환경변수(.env, 접근 제한)로 관리. `.env`는 절대 `git push` 금지.
TLS 1.3 실전. 2018년 표준. 핸드셰이크 1-RTT, 취약 암호 모두 제거. 2026년 기준 신규 배포는 최소 TLS 1.2, 권장 1.3. HSTS 헤더로 HTTP 접근 아예 차단.
# 내 사이트 TLS 설정 감사
curl -v https://jit-learning.com 2>&1 | grep -E "SSL|TLS"
# * SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256 ← 좋음
# 더 상세한 감사 (무료)
# https://www.ssllabs.com/ssltest/analyze.html?d=jit-learning.com
# HSTS 헤더 (권장)
# Strict-Transport-Security: max-age=31536000; includeSubDomains; preloadVercel·Cloudflare는 자동으로 TLS 1.3 + HSTS 세팅. 직접 서버 운영 시 Nginx/Caddy에 명시.
대량 데이터를 빠르게 암호화하며 무결성까지 보장하는 AES 모드는?
TLS 1.3은 핸드셰이크 RTT 수가 TLS 1.2보다 적다.