GitHub - Mineru98/client-side-cryptography
핵심 포인트
- 1이 시스템은 클라이언트와 서버 간의 JSON 데이터 통신을 위한 완전 자동화된 양방향 암호화/복호화 웹 애플리케이션을 구축합니다.
- 2클라이언트에서는 WebAssembly 기반 Go 암호화 모듈을, 서버에서는 Express.js 미들웨어를 사용하여 AES-256-GCM 암호화를 투명하게 처리합니다.
- 3`/api/secure/*` 경로의 사용자 및 데이터 관리와 같은 민감한 API 통신에 자동 암호화를 적용하여 개발자가 평문 데이터를 다루는 듯한 투명성을 제공하면서 강력한 보안을 보장합니다.
본 논문은 클라이언트와 서버 간의 모든 JSON 데이터 통신을 자동으로 암호화 및 복호화하는 Web Security - 양방향 암호화 통신 시스템 구현에 대해 설명한다. 이는 개발자가 평문 JSON 데이터를 다루는 것처럼 코딩하면서도 백그라운드에서 모든 통신이 안전하게 암호화되도록 설계된 보안 웹 애플리케이션이다.
1. 핵심 방법론 및 시스템 구조
본 시스템의 핵심은 투명한(transparent) 암호화/복호화 메커니즘을 제공하는 데 있다. 이는 클라이언트 측과 서버 측에서 각각 암호화/복호화 모듈을 통합하여 구현된다.
- 데이터 플로우:
- 클라이언트 → 서버: 클라이언트(브라우저)에서 전송할 평문 JSON 데이터는
crypto-utils.js모듈을 통해WebAssembly기반 암호화 모듈로 전달된다. 이 모듈은 Go 언어로 구현된 고성능 암호화 엔진(Go 암호화 엔진)을WebAssembly(main.wasm)로 컴파일하여 사용한다. 여기서AES-256-GCM알고리즘을 사용하여 JSON 데이터를 암호화하고Base64로 인코딩된 암호화된 JSON 데이터(Encrypted JSON Data)를 생성한다. 이 데이터는 네트워크를 통해 서버로 전송된다. - 서버 → 클라이언트: 서버(
Express.js Server)는 수신된 암호화된 JSON 데이터를자동 암호화 미들웨어를 통해 처리한다. 이 미들웨어는crypto.js모듈을 사용하여 수신된 데이터를 복호화하여 비즈니스 로직(Business Logic)이 평문 JSON 데이터를 다룰 수 있도록 한다. 비즈니스 로직의 응답 JSON 데이터는 다시 미들웨어를 통해 암호화되어 클라이언트로 전송된다. 클라이언트에서는WebAssembly모듈을 통해 이를 복호화하여 평문 JSON 데이터를 브라우저에 전달한다.
- 클라이언트 → 서버: 클라이언트(브라우저)에서 전송할 평문 JSON 데이터는
- 기술 스택 및 구성 요소:
- 클라이언트 계층:
- 브라우저: 사용자 인터페이스.
crypto-utils.js: 클라이언트 측 암호화 유틸리티 및 웹 API 호출을 래핑하여 암호화/복호화를 투명하게 처리한다.WebAssembly암호화 모듈: Go 언어(main.go)로 구현된 암호화 로직을WebAssembly바이너리(main.wasm)로 컴파일하여 브라우저에서 고성능으로 실행된다.wasm_exec.js는WebAssembly모듈의 실행을 돕는다.
- 서버 계층:
Express.js서버: Node.js 기반의 백엔드 서버.- 자동 암호화 미들웨어: 특정 API 경로(
api/secure/*)로 들어오는 요청의 본문(request body)을 자동으로 복호화하고, 응답(response)을 자동으로 암호화하는 역할을 한다. 이를 통해 비즈니스 로직은 암호화/복호화 과정에 직접 관여하지 않고 평문 데이터를 처리할 수 있다. crypto.js모듈: 서버 측 암호화 및 복호화 작업을 담당한다.- 비즈니스 로직: 실제 애플리케이션의 핵심 기능을 수행하며 평문 JSON 데이터를 입출력으로 사용한다.
- 클라이언트 계층:
- 경로별 처리:
/api/secure/*경로는 모든 요청과 응답에 대해 자동 암호화/복호화가 적용된다.- 그 외 경로는 개발자의 필요에 따라 선택적으로 암호화를 적용할 수 있다.
2. 보안 특성 및 암호화 스펙
본 시스템은 강력한 암호화 알고리즘을 사용하여 데이터의 기밀성과 무결성을 보장한다.
- 암호화 알고리즘:
AES-256-GCM(Advanced Encryption Standard with Galois/Counter Mode)을 사용한다. 이는 현재 널리 사용되는 대칭키 암호화 알고리즘 중 하나로, 기밀성(Confidentiality)과 무결성(Integrity), 인증(Authenticity)을 동시에 제공한다. - 키 크기: 256비트 (32바이트)의 암호화 키를 사용한다.
- IV 크기: 96비트 (12바이트)의 초기화 벡터(Initialization Vector)를 사용한다.
GCM모드에서 IV는 Nonce(Number used once)로 사용되며, 각 암호화 작업마다 고유해야 한다. - 태그 크기: 128비트 (16바이트)의 인증 태그(Authentication Tag)를 사용한다. 이는 데이터의 무결성을 검증하는 데 사용된다.
- 인코딩: 암호화된 데이터는
Base64로 인코딩되어 전송된다. - 키 관리: 암호화 키는 환경 변수(
ENCRYPTION_KEY)를 통해 관리되어 코드에 하드코딩되는 것을 방지한다. - 보안 고려사항: 프로덕션 환경에서는
HTTPS사용이 권장되며, 정기적인 암호화 키 교체(Key Rotation) 및 민감한 데이터의 로그 제외가 강조된다.
3. 실용적인 API 및 배포
본 시스템은 사용자 관리, 데이터 관리, 메시징 시스템 등 다양한 API에 자동 암호화를 적용하여 실제 웹 애플리케이션에 바로 적용 가능한 형태로 제공된다. Docker Compose를 통해 전체 스택의 개발 및 프로덕션 환경 배포가 용이하게 구성되어 있다.
이 시스템은 WebAssembly를 통한 고속 암호화 처리, 미들웨어 기반의 효율적인 데이터 처리, 비동기 처리를 통한 UI 블로킹 방지 등 성능 최적화와 확장성을 고려하여 설계되었다.