Afternote 라는 프로젝트에서 사용자의 소셜 아이디,비밀번호를 DB에 저장해야하는 상황이 생겼다.
pm님은 이 정보를 암호화해서 저장하길 원하셔서 여러 방법을 알아보았다.
네트워크 격리
일단 지금은 로컬 DB로 하고 있지만 최종 설계는 아래와 같다.

이런 식으로 Amazon RDS를 쓰는 계획인데 여러 이유가 있다.
- 물리적·네트워크적 격리 (Private Subnet)
RDS를 외부 인터넷 연결이 불가능한 Private Subnet에 배치했기 때문에, 해커가 외부에서 데이터베이스에 직접 접근하는 것 자체가 차단된다. - 보안 그룹(Security Group)을 통한 최소 권한 원칙
단순히 숨기는 것에서 그치는 것뿐만 아니라 보안 그룹 설정으로도 추가적인 보안을 생각했는데
RDS의 보안 그룹(Security Group)을 설정할 때 오직 Spring 서버가 있는 EC2의 보안 그룹 ID로부터 들어오는 인바운드 트래픽만 허용하도록 구성했다.
데이터 암호화
뿐만 아니라 데이터를 RDS에 넣을 때도 암호화를 시켜서 넣음으로써 더욱 더 좋은 보안성을 추구했는데,
일단 아예 처음 하는 분야라 좀 찾아봤었다. gemini랑 놀 때 아래 요소들을 물어봤었는데,
- 복호화
- 모바일인지 웹인지
우리 프로젝트는 복호화를 해서 그 데이터를 줘야하고 모바일 프로젝트이기 때문에
"ChaCha20-Poly1305" 이라는 기술을 채택했다.
복호화를 해야하니까 AES와 ChaCha20를 고민했는데, 모바일 최적화라는 부분을 생각해보니
대부분의 모바일 기기는 ARM 아키텍처를 사용하니까 AES-GCM은 하드웨어 가속(AES-NI)이 없는 저사양 기기에서 성능 저하가 발생할 수 있지만, ChaCha20은 소프트웨어 구현만으로도 ARM 프로세서에서 AES보다 2~3배 빠른 속도를 보인다고 해서 선택했다.
그 외에도 아래 이유들이 있다.
- 무결성 보장(AEAD): 단순 암호화뿐만 아니라 Poly1305를 통한 인증(Authentication) 기능이 내장되어 있어, 데이터가 전송 중에 1비트라도 변조되면 즉시 감지할 수 있는 AEAD(Authenticated Encryption with Associated Data) 방식을 채택.
- 재사용 공격 방지: AES-CBC 등에서 발생할 수 있는 IV(Initialization Vector) 재사용 문제를 방지하기 위해, 매번 랜덤한 Nonce를 생성하여 암호문과 함께 저장하는 방식을 적용해 보안성을 극대화.
'Project > Afternote' 카테고리의 다른 글
| [CDN] S3 presigned URL에서 CDN 도메인 전환하기 (0) | 2026.04.12 |
|---|---|
| [Github Action] CI/CD 적용기 (0) | 2026.04.05 |
| [VPC/EC2/RDS] 인프라 적용기 (0) | 2026.03.29 |
| [트러블슈팅] OCP 위반 코드 수정 (0) | 2026.03.22 |
| [트러블 슈팅] Test 환경 구축 (0) | 2026.03.22 |