docs: add project docs and test updates
This commit is contained in:
58
docs/보안관련/01-개인정보_보안_현황.md
Normal file
58
docs/보안관련/01-개인정보_보안_현황.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# 개인정보·보안 현황
|
||||
|
||||
> 현재 구현 기준. DB·세션·로그·화면 접근을 정리한 문서.
|
||||
|
||||
---
|
||||
|
||||
## 1. 비밀번호
|
||||
|
||||
| 항목 | 내용 |
|
||||
|------|------|
|
||||
| **저장** | DB에는 **해시만** 저장 (`password_hash(..., PASSWORD_DEFAULT)` → PHP bcrypt) |
|
||||
| **위치** | `Auth::register`, `Admin\User::store`, `Admin\User::update` |
|
||||
| **검증** | 로그인 시 `password_verify()` 사용. 평문 비밀번호는 저장·전달하지 않음 |
|
||||
|
||||
---
|
||||
|
||||
## 2. DB에 저장되는 개인정보(비밀번호 제외)
|
||||
|
||||
- **member 테이블**: `mb_id`, `mb_name`, `mb_email`, `mb_phone` 등은 **평문** 저장.
|
||||
- **암호화**: 애플리케이션 단에서 이 컬럼들에 대한 암호화·복호화는 **없음**.
|
||||
- **DB 연결**: `app/Config/Database.php` 에서 `'encrypt' => false`. DB 연결 구간 암호화(TLS)는 앱 설정에 없음(서버/DB 설정에 따름).
|
||||
|
||||
---
|
||||
|
||||
## 3. 세션
|
||||
|
||||
- **저장 항목**: `mb_idx`, `mb_id`, `mb_name`, `mb_level`, `logged_in`
|
||||
- **비밀번호·이메일·연락처는 세션에 넣지 않음.**
|
||||
|
||||
---
|
||||
|
||||
## 4. 로그(member_log)
|
||||
|
||||
- **저장 필드**: `mb_idx`, `mb_id`, `mll_regdate`, `mll_ip`, `mll_msg`, `mll_useragent`, `mll_url`, `mll_referer` 등
|
||||
- **비밀번호는 로그에 기록되지 않음.**
|
||||
- 로그인 시도 시 **아이디(mb_id)** 는 그대로 저장됨(실패/성공 구분용). 마스킹·축약 저장은 없음.
|
||||
|
||||
---
|
||||
|
||||
## 5. 화면·접근
|
||||
|
||||
- 뷰 출력 시 `esc()` 사용 → **XSS** 방지.
|
||||
- 회원 목록(이름·이메일·연락처 등)은 **관리자만** 조회 가능(`adminAuth` 필터).
|
||||
|
||||
---
|
||||
|
||||
## 6. 요약
|
||||
|
||||
| 구분 | 적용 여부 |
|
||||
|------|-----------|
|
||||
| 비밀번호 해시 저장·검증 | ✅ 적용 |
|
||||
| 세션에 비밀번호 미저장 | ✅ 적용 |
|
||||
| 로그에 비밀번호 미기록 | ✅ 적용 |
|
||||
| 출력 이스케이프(esc) | ✅ 적용 |
|
||||
| 관리자만 회원 목록 조회 | ✅ 적용 |
|
||||
| 이름·이메일·연락처 DB 암호화 | ⚠️ 선택 적용 (키 설정 시 `mb_phone`, `mb_email` 암호화. [03-개인정보_암호화.md](03-개인정보_암호화.md) 참고) |
|
||||
| 로그의 mb_id 마스킹 | ❌ 미적용 |
|
||||
| DB 연결 암호화(TLS) 설정 | ❌ 앱 설정 없음 |
|
||||
37
docs/보안관련/02-개선_검토_사항.md
Normal file
37
docs/보안관련/02-개선_검토_사항.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# 보안·개인정보 개선 검토 사항
|
||||
|
||||
> 개인정보보호법·내부 정책에 맞춰 추후 검토할 수 있는 항목.
|
||||
|
||||
---
|
||||
|
||||
## 1. DB 저장 암호화
|
||||
|
||||
- **대상**: `member.mb_name`, `mb_email`, `mb_phone` 등 개인정보 필드
|
||||
- **방식**: 필드 단위 암호화(예: CI4 Encryption, AES) 후 DB 저장, 조회 시 복호화
|
||||
- **참고**: `app/Config/Encryption.php` 에 키 설정 후 Encrypter 사용 가능
|
||||
|
||||
---
|
||||
|
||||
## 2. 로그 내 식별자 마스킹
|
||||
|
||||
- **대상**: `member_log.mb_id` (로그인 시도 아이디)
|
||||
- **방식**: 전체 저장 대신 앞뒤 일부만 저장하거나 마스킹(예: `ab***ef`) 후 저장
|
||||
- **목적**: 로그 유출 시 개인 식별 가능성 완화
|
||||
|
||||
---
|
||||
|
||||
## 3. DB 연결 암호화(TLS)
|
||||
|
||||
- **대상**: 애플리케이션 ↔ DB 서버 구간
|
||||
- **방식**: MySQL SSL/TLS 설정 후 `app/Config/Database.php` 에서 `encrypt`·DSN 옵션 설정
|
||||
- **참고**: DB 서버·호스팅 측에서 SSL 지원 여부 확인 필요
|
||||
|
||||
---
|
||||
|
||||
## 4. 기타 검토
|
||||
|
||||
- **세션**: 세션 고정·타임아웃·재로그인 정책
|
||||
- **관리자**: 관리자 계정 2단계 인증, 접근 로그
|
||||
- **비밀번호**: 최소 길이·복잡도·주기적 변경 정책(현재는 4자 이상, 해시 저장만 적용)
|
||||
|
||||
위 항목은 필요 시 단계적으로 도입을 검토하면 된다.
|
||||
73
docs/보안관련/03-개인정보_암호화.md
Normal file
73
docs/보안관련/03-개인정보_암호화.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# 개인정보 암호화 (전화번호·이메일 등)
|
||||
|
||||
> 비밀번호는 해시(일방향), 전화번호·이메일 등은 **암호화(양방향)** 로 저장해, 키가 없으면 개발자도 복호화할 수 없게 하는 방법.
|
||||
|
||||
---
|
||||
|
||||
## 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` → `.env`의 `encryption.key`. 키가 비어 있으면 암호화/복호화를 건너뛰어 기존 평문 데이터와 호환.
|
||||
- **저장 형식**: 암호문 앞에 `ENC:` 접두어를 붙여 “암호화된 값”인지 구분. 기존 평문 데이터는 그대로 두고, 새로 넣거나 수정할 때만 암호화해 저장.
|
||||
|
||||
---
|
||||
|
||||
## 4. 키 설정 방법
|
||||
|
||||
1. **키 생성** (32바이트):
|
||||
```bash
|
||||
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.php` — `pii_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` — `.env`의 `encryption.key`(64자 hex)를 읽어 사용. 키가 없으면 암호화/복호화 생략.
|
||||
|
||||
---
|
||||
|
||||
## 6. 정리
|
||||
|
||||
- 전화번호·이메일 등은 **암호화**해서 저장하고, **키**로만 복호화합니다.
|
||||
- 키를 **코드/저장소 밖**(`.env`·키 관리 서비스)에 두면, **개발자가 해독할 수 없게** 할 수 있습니다.
|
||||
- 비밀번호는 계속 **해시만** 저장하고, 개인정보 필드만 암호화하는 방식이 적절합니다.
|
||||
13
docs/보안관련/README.md
Normal file
13
docs/보안관련/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# 보안 관련 정리
|
||||
|
||||
> DB·앱에서의 사용자 개인정보 및 보안 처리 현황.
|
||||
|
||||
---
|
||||
|
||||
## 문서 목록
|
||||
|
||||
| 파일 | 내용 |
|
||||
|------|------|
|
||||
| [01-개인정보_보안_현황.md](01-개인정보_보안_현황.md) | 비밀번호·DB·세션·로그·화면 접근 등 종합 현황 |
|
||||
| [02-개선_검토_사항.md](02-개선_검토_사항.md) | 추후 검토 가능한 보안·개인정보 보강 항목 |
|
||||
| [03-개인정보_암호화.md](03-개인정보_암호화.md) | 전화번호·이메일 암호화 저장, 키 관리, 개발자 비해독 가능 |
|
||||
Reference in New Issue
Block a user