목록 보기
컬리 공통 암호화 모듈의 동시성 이슈 해결하기
백엔드

컬리 공통 암호화 모듈의 동시성 이슈 해결하기

마켓컬리
마켓컬리
2022년 9월 25일

두줄요약

공유 캐시의 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 등 가변 상태를 공유 캐시 객체와 함께 다룰 때 동시성 검토 필요
  • 고정 스레드 풀 기반 테스트로 간헐적 오류를 재현하고 버퍼 상태값 검증

컬리 계열사 채용12건

채용 사이트에서 전체 보기

다음 읽기

#동시성 주제를 이어서 읽기

컬리 공통 암호화 모듈의 동시성 이슈 해결하기

컬리 공통 암호화 모듈에서 간헐적인 `newPosition > limit` 버퍼 오류를 분석했습니다. 스레드 간 공유 버퍼가 원인이었고 `duplicate()`로 동시성 문제를 해결했습니다.

마켓컬리
마켓컬리
백엔드

댓글 0개

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...