Web Crypto API로 암호화하고 Go 서버에서 복호화할 때 자주 틀리는 것
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
브라우저 암호화와 서버 복호화를 연결할 때 키, IV, 직렬화에서 주의할 점을 설명한다. 복잡한 기능 이름보다 먼저 확인할 것은 ‘위협 모델’입니다. HTTPS가 이미 구간 암호화를 제공하므로 추가 암호화가 막으려는 대상을 먼저 정합니다. 브라우저 코드에 장기 비밀키를 넣는 방식은 소스와 실행 환경에서 키를 숨길 수 없습니다.
이 글의 범위
실제 경험이나 측정 결과를 가정하지 않고, 공식 문서로 확인 가능한 개념과 적용 순서를 일반 가이드로 설명합니다. 제품 버전과 서비스 정책은 바뀔 수 있으므로 적용 전 연결된 공식 문서를 다시 확인하세요.
판단의 출발점
브라우저와 Go의 암호화 연동은 함수 이름보다 위협 모델, nonce 재사용 방지, 정확한 바이트 규격, 키 수명 관리가 핵심입니다. ‘위협 모델’에서 시작해 ‘알고리즘’와의 경계를 정하면 구현할 범위와 실패했을 때 확인할 지점을 구분하기 쉬워집니다.
구현 전에 합의할 암호화 규격
위협 모델
HTTPS가 이미 구간 암호화를 제공하므로 추가 암호화가 막으려는 대상을 먼저 정합니다. 브라우저 코드에 장기 비밀키를 넣는 방식은 소스와 실행 환경에서 키를 숨길 수 없습니다.
알고리즘
Web Crypto와 Go 양쪽에서 동일한 AES-GCM 규격을 사용하면 암호화와 무결성 검증을 함께 처리할 수 있습니다. 키 길이와 태그 크기를 문서로 고정합니다.
Nonce 또는 IV
같은 키에서 GCM nonce를 재사용하면 안전성이 크게 무너질 수 있습니다. 브라우저에서 매 메시지마다 충분한 길이의 새 난수를 만들고 ciphertext와 함께 전송합니다.
바이트 직렬화
문자열, UTF-8, Base64, URL-safe Base64를 명확히 구분합니다. 브라우저의 ArrayBuffer와 Go의 []byte가 같은 바이트를 보도록 패킷 구조를 버전과 함께 정의합니다.
키 수명
키 생성, 전달, 보관, 회전, 폐기 절차가 구현 코드보다 중요합니다. 클라이언트별 단기 키나 서버 공개키를 이용한 키 합의처럼 노출 범위를 줄이는 구조를 검토합니다.
| Web Crypto API로 암호화하고 Go 서버에서 복호화할 때 자주 틀리는 것 핵심 판단 흐름 설명용 개념도 |
그림 1. Web Crypto API로 암호화하고 Go 서버에서 복호화할 때 자주 틀리는 것의 핵심 판단 순서를 정리한 설명용 개념도입니다. 실제 서비스 화면, 운영 로그 또는 측정 결과가 아닙니다. 이미지 ALT:
동작해도 안전하지 않은 구현
- JavaScript 번들 안에 모든 사용자가 공유하는 비밀키를 하드코딩하기
- 같은 키와 IV를 여러 메시지에 반복 사용하기
- 인증 태그 실패를 무시하고 평문처럼 처리하기
- Base64 문자열을 실제 UTF-8 평문과 혼동하기
양쪽 구현을 맞추는 순서
- 평문 샘플과 기대 바이트를 정하고 UTF-8 인코딩을 고정합니다.
- 알고리즘, 키 길이, nonce 길이, 인증 태그 길이, AAD 사용 여부를 문서화합니다.
- 전송 객체에 version, nonce, ciphertext를 각각 Base64로 넣습니다.
- Go에서 Base64 해제 뒤 AEAD Open으로 인증과 복호화를 동시에 수행합니다.
- 변조된 ciphertext, 잘못된 nonce, 만료 키, 빈 문자열을 자동 테스트합니다.
전송 객체의 예
{
"version": 1,
"algorithm": "AES-GCM",
"nonce": "<base64>",
"ciphertext": "<base64 including auth tag>"
}
운영 전 빠른 점검
| 확인 항목 | 질문 |
|---|---|
| 첫 기준: 위협 모델 | 변경 전에 전제와 목적을 확인했는가? |
| 분리 대상: 알고리즘 | 다른 책임과 섞이지 않게 경계를 정했는가? |
| 피할 패턴: JavaScript 번들 안에 모든 사용자가 공유하는 비밀키를 하드코딩하기 | 본문에서 경고한 패턴이 남아 있지 않은가? |
| 오류와 복구 | 정상 경로뿐 아니라 실패와 되돌리기도 확인했는가? |
마무리
브라우저와 Go의 암호화 연동은 함수 이름보다 위협 모델, nonce 재사용 방지, 정확한 바이트 규격, 키 수명 관리가 핵심입니다. 추가 암호화가 HTTPS를 대체하지 않는다는 전제에서 실패 테스트까지 포함해 설계해야 합니다.
댓글
댓글 쓰기