← 경력 기술서

민감정보 분리 경험 기록

쿠팡 재직 중 진행한 민감정보 분리보관 Task 기록

서비스가 어느정도 궤도에 오르면 통상적으로 거쳐야 하는 과정 중 하나가 민감 정보 관리 감사인 것 같습니다. 이전 회사 재직 중이던 2020년 3월 ~ 10월 중순까지 소속 팀의 민감 정보 분리보관 Task를 진행했습니다.

보안 조직의 요구사항 (기억나는 대로)

사내 지원

당시 소속 팀 상황

분리보관 구현 설계

별도의 물리 DB를 따로 두지 않고 기존 물리 DB 안에 분리보관용 Schema를 구성. Spring/JPA에서 분리보관용 Schema에 대한 연결을 위해 multiple Database 설정.

Schema 분리 구조

팀 서비스는 반품 검수 도메인 특성상 실시간 처리를 하지 않아도 된다고 결론. 멤버팀에서 발행하는 Kafka message를 consume하여 분리보관 Schema의 masterLog table에 적재.

Kafka consume 구조

masterLog 적재 구조

2개의 Batch Process(민감정보 분리 보관, 분리보관 이후 5년 뒤 삭제)를 개발. 1일 1회씩 batch 실행.

1. 민감정보 분리 보관 Batch

서비스 유휴시간(4:00AM ~ 7:00AM)에 분리보관을 진행할 Batch job 실행. 우선순위는 탈퇴자(withdraw-1,2) > 장기 미사용자(dormant) > 원복자(restore)

아래의 Flow는 Batch 전체의 진행 흐름이며, 각 분리보관 상세 흐름은 하위에 기술.

Batch 전체 Flow

일반사용자 → 탈퇴자 처리 (withdraw-1)

withdraw-1 Flow

장기 미이용자 → 탈퇴자 처리 (withdraw-2)

withdraw-2 Flow

일반 사용자 → 장기 미이용자 처리 (dormant)

dormant Flow

장기 미이용자 → 원복 처리 (restore)

restore Flow

2. 분리보관 이후 5년 뒤 삭제

서비스 유휴시간(07:00AM ~ 08:00AM)에 분리보관 이후 5년 지난 탈퇴자 정보 삭제.

5년 경과 삭제 Flow

과거 3년치 적재 정보에 대한 분리보관 migration 진행. (첫 target 일자를 2018-01-01로 설정)

과거 데이터 migration

기억에 남는 부분들

  1. RDB 특성상 각 테이블간의 관계가 다양하게 얽혀있음에도 불구하고 보안 정책상 대상 row의 Hard Delete 및 원복을 염두해야 했습니다. 따라서 Hard Delete시 Cascade를 무시하도록 JPA 관련 Option을 조사했던 기억이 납니다.
  2. 조회 대상 entity와 관계를 가지고 있는 정보가 Hard Delete되어 JPA 기능으로 찾지 못하는 경우, 해당 내용은 Null로 치환하도록 모든 코드를 수정했습니다.
  3. ORM을 통하여 테이블 entity 개발하는 경우, 일반적으로 PK 컬럼에 Auto Increment를 설정합니다. 원복시 기존 PK 값을 그대로 사용하여 insert가 되어야 하는데, 이 Auto Increment 제약이 너무 강력하여 원하는 PK값으로 원복이 되지 않는 경우가 발생했습니다. 따라서 원복시에는 JPA를 통한 insert가 아닌 native query를 이용하여 원하는 PK값으로 insert할 수 있도록 기능을 구현했습니다.
  4. 대상 정보를 발행하는 멤버팀의 사정으로 특정일에 3~4일치의 정보가 한번에 발행되는 일이 간혹 있습니다. 따라서 분리보관 Batch는 대상 양이 많아도 큰 부하 없이 처리되도록 200 row 단위의 pagination 및 tx를 설정했습니다.
  5. 만약 10만 row에 대해 분리보관 중에 하나가 실패하면 10만 row 전체 rollback이 아닌, 해당 실패 지점을 포함하는 200 row만 실패되도록 처리됩니다. 따라서 해당 일자 재실행시 실패한 200 row에 대해서만 조회하여 처리합니다.