Files
jongryangje/docs/보안관련/03-개인정보_암호화.md
2026-04-08 00:23:55 +09:00

3.5 KiB

개인정보 암호화 (전화번호·이메일 등)

비밀번호는 해시(일방향), 전화번호·이메일 등은 암호화(양방향) 로 저장해, 키가 없으면 개발자도 복호화할 수 없게 하는 방법.


1. 해시 vs 암호화

구분 비밀번호 전화번호·이메일 등
목적 로그인 시 “같은지”만 검사 화면·연락에 다시 읽어서 써야 함
방식 해시(일방향) 암호화(양방향)
저장 해시만 저장 암호문 저장, 로 복호화

그래서 개인정보는 암호화해서 저장하고, 읽을 때만 복호화합니다.


2. “개발자가 해독할 수 없게” 하려면

  • 암호화/복호화는 키(비밀키) 로 합니다.
  • 키를 앱/코드 밖에 두면, 코드를 아는 개발자라도 키가 없으면 복호화할 수 없습니다.

권장:

  • 암호화 키.env(또는 환경 변수)에만 넣고, 저장소에는 올리지 않음 (.env.gitignore).
  • 운영 서버에서는 서버만 갖는 키를 두고, 개발 PC에는 키를 두지 않거나 테스트용 키만 둠.
  • 필요하면 AWS KMS, HashiCorp Vault 등 키 관리 서비스로 키를 분리할 수 있습니다.

이렇게 하면 “키가 없는 사람(예: 코드만 본 개발자)”은 DB에 저장된 암호문을 풀 수 없습니다.


3. 이 프로젝트에서의 구현 개요

  • 대상 필드: member.mb_phone, member.mb_email (선택: mb_name)
  • 방식: 저장 전 암호화, 조회 후 복호화. CI4 Encryption(OpenSSL) 사용.
  • : app/Config/Encryption.php.envencryption.key. 키가 비어 있으면 암호화/복호화를 건너뛰어 기존 평문 데이터와 호환.
  • 저장 형식: 암호문 앞에 ENC: 접두어를 붙여 “암호화된 값”인지 구분. 기존 평문 데이터는 그대로 두고, 새로 넣거나 수정할 때만 암호화해 저장.

4. 키 설정 방법

  1. 키 생성 (32바이트):
    php -r "echo bin2hex(random_bytes(32));"
    
  2. .env에 추가 (저장소에 커밋하지 않음):
    encryption.key = 위에서 나온 64자 hex 문자열
    
  3. app/Config/Encryption.php에서 $key가 환경 변수에서 오도록 설정했는지 확인. (기본값은 빈 문자열이고, .env에서 덮어쓰면 됨.)

키를 넣지 않으면 암호화/복호화가 동작하지 않고, 값은 평문으로 저장·조회됩니다.


5. 구현 요약 (이 프로젝트)

  • 헬퍼: app/Helpers/pii_encryption_helper.phppii_encrypt($value), pii_decrypt($value)
  • 대상 필드: member.mb_phone, member.mb_email (상수 PII_ENCRYPTED_FIELDS)
  • 저장 형식: 암호화 시 ENC: + base64(암호문). 미암호화(키 없음) 또는 기존 평문은 그대로 저장·조회.
  • 사용처: Auth::register 저장 전 암호화, Admin\User::store / update 저장 전 암호화, Admin\User::index / edit 조회 후 복호화.
  • 설정: app/Config/Encryption.php.envencryption.key(64자 hex)를 읽어 사용. 키가 없으면 암호화/복호화 생략.

6. 정리

  • 전화번호·이메일 등은 암호화해서 저장하고, 로만 복호화합니다.
  • 키를 코드/저장소 밖(.env·키 관리 서비스)에 두면, 개발자가 해독할 수 없게 할 수 있습니다.
  • 비밀번호는 계속 해시만 저장하고, 개인정보 필드만 암호화하는 방식이 적절합니다.