
컬리 공통 암호화 모듈의 동시성 이슈 해결하기
두줄요약
공유 캐시의 AWS KMS Data Key 버퍼에서 발생한 간헐적 동시성 오류를 분석했습니다.\n동기화 대신 ByteBuffer 복제로 스레드별 버퍼를 분리해 해결했습니다.
문제 상황
- AWS KMS Data Key를 Caffeine 캐시에 보관하는 공통 암호화 SDK에서 간헐적
newPosition > limit오류 - 개인정보 마스킹용 전화번호 복호화 실패로 일부 고객의 전화번호 확인 불가
원인 분석
- 캐시된
GenerateDataKeyResult의ByteBuffer를 여러 스레드가 공유하며position상태 변경 clear()이후에도 일부 스레드에서position이 32로 관찰된 비스레드 안전 상태- Buffer API의 다중 스레드 접근 비안전성 및 동기화 필요 조건 확인
해결 방법
- 성능 저하 가능성이 있는
synchronized대신ByteBuffer.duplicate()선택 - 스레드별 지역 버퍼 객체 생성으로 공유 버퍼 상태 변경 차단
asReadOnlyBuffer()권장 사항과 동일한 원리 활용
주의할 점
ByteBuffer의position,limit등 가변 상태를 공유 캐시 객체와 함께 다룰 때 동시성 검토 필요- 고정 스레드 풀 기반 테스트로 간헐적 오류를 재현하고 버퍼 상태값 검증


