피드로 돌아가기
딜리버리 암호화 모듈 개발기
컬리 기술블로그컬리 기술블로그
Backend

딜리버리 암호화 모듈 개발기

딜리버리 팀이 자체 암호화 모듈 cowcow-enc를 개발해 봉투암호화 헤더를 10~30% 축소하고 JPA @Converter 패턴으로 자동 암복호화 구현

2025년 6월 2일12intermediate

Context

2023년 9월 새로운 배송시스템 오픈을 앞두고 기존 오픈소스 암호화 라이브러리의 보안 취약점 보고와 미지의 요구사항 대응 어려움에 직면했다. 또한 Hibernate 6.x 버그로 인해 PreLoadEventListener 방식의 암복호화 처리가 Spring Boot 3.0 이상에서 동작하지 않았다.

Technical Solution

  • JPA @Converter 패턴 선택: AttributeConverter를 구현해 엔티티의 필드 단위 자동 암복호화를 리플렉션 없이 처리
  • 봉투암호화(Envelope Encryption) 도입: 클라우드 제공업체의 마스터키로부터 암호키를 발급받고 암호화된 암호키를 데이터와 함께 저장
  • 봉투 헤더 구조 최적화: 범용 오픈소스와 달리 특정 요구사항에 맞춰 부수 정보를 제거해 저장 공간 감소
  • Base64 인코딩 제거: 바이트 데이터를 PostgreSQL/MySQL의 바이트 전용 타입으로 저장해 인코딩 오버헤드 제거
  • 종속성 최소화: compileClasspath에 0개, runtimeClasspath에 4개만 노출해 의존성 충돌 위험 감소
  • Property-based 테스트 적용: fixture-monkey를 사용해 1000개의 랜덤 입력값으로 암복호화 엣지케이스 검증

Impact

  • 봉투 크기 10~30% 절감 (보안 수준 유지)
  • 암호화 처리: 300만 개 평문 기준 5.58초, 복호화 5.36초 (M1 맥북프로 16GB, Xms256m, G1 GC)
  • 11분 이상 지속 처리 시 CPU 안정성 확인, Heap 메모리 정상 해제

Key Takeaway

자체 개발한 암호화 모듈은 오픈소스의 미지의 버그나 버전 호환성 문제로부터 자유로우며, 특정 도메인의 요구사항에 맞춰 저장소 크기와 성능을 함께 최적화할 수 있다. 특히 JPA @Converter 패턴은 엔티티 개발자의 복잡성을 최소화하면서 JPQL/QueryDSL 프로젝션에서도 자동 복호화를 보장하는 실무 친화적 방식이다.


Spring Boot를 사용하는 팀에서 민감한 데이터를 암호화해야 할 때, JPA @Converter를 통해 엔티티 필드 수준에서 자동 암복호화를 구현하고, 봉투암호화로 암호키 탈취 위험을 낮출 수 있다. Property-based 테스트(fixture-monkey 또는 jqwik)와 실제 애플리케이션 환경(cowcow-tests)에서의 호환성 검증을 병행하면 Spring Boot 메이저 버전 업그레이드 시에도 안정성을 확보할 수 있다.

원문 읽기