# ADMIN_AUTH_PLAN (Laravel 12) > 목적: **관리자(Admin) 영역**을 “허용된 IP + 이메일/비밀번호 + SMS OTP(필수) + (옵션) TOTP” 구조로 구축한다. > 개발 환경: NAS nginx-proxy(HTTPS) → 내부 Docker(HTTP) → Laravel 12(PHP 8.3), Redis 사용 --- ## 0) 현재 전제(프로젝트 컨텍스트) - Web 도메인: `four.syye.net` - Admin 도메인: `shot.syye.net` - **Admin 도메인은 Laravel 라우트 그룹에서만** 접근 제어(개발용). (Nginx allow/deny는 나중에 CloudFront/WAF에서 구현) - Reverse proxy 구조: - NAS `nginx-proxy`에서 HTTPS 종료 - 내부로 `gifticon-web:8091`, `gifticon-admin:8092`로 전달 - PHP는 `gifticon-app`(php-fpm)에서 처리 - Redis 사용: `gifticon-redis` --- ## 1) 보안 목표 & 정책 ### 1.1 1차 방어: Admin IP Allowlist - Admin 도메인 라우트 그룹에 `admin.ip` 미들웨어를 **반드시** 적용한다. - `.env`의 `ADMIN_ALLOWED_IPS` 값을 사용한다. - 실패 시 403. > ⚠️ admin.ip 미들웨어를 login 라우트에 안 붙이면 “로그인 페이지가 열려 보안이 뚫린 것처럼 보이는” 문제가 생김. > 해결: **도메인 그룹 단에서** `['web','admin.ip']` 적용. ### 1.2 2차 인증: 이메일/비밀번호 + SMS OTP(필수) - 이메일/비밀번호가 맞으면 “임시 인증 상태”를 Redis에 저장하고, SMS로 OTP 코드를 발송한다. - OTP 검증 성공 시에만 `auth:admin` 로그인 완료. ### 1.3 (옵션) TOTP(구글 OTP) - 기본은 SMS OTP. - “최고 관리자/특정 역할”에 한해 TOTP를 **옵션으로 활성화** 가능하도록 설계. - 보안 우선순위: **TOTP > SMS** (SMS는 SIM 스와프 리스크 존재) - 현실 운영 편의: **SMS만으로도 가능**, 대신 IP allowlist + rate limit + audit log를 강화. ### 1.4 비밀번호 해시(강력) - Laravel `Hash::make()` 사용 (기본 bcrypt/argon 설정은 config로 통제) - 권장: `argon2id` 고려(서버 자원 여유 있으면). 운영에서 튜닝(메모리/시간 비용) 필요. ### 1.5 전화번호 저장 정책 (B안 보안강화) - DB에는 평문 전화번호를 저장하지 않는다. - `phone_enc`(암호화 저장) + `phone_hash`(조회용) 조합 사용 - `phone_hash`: HMAC-SHA256(키 = `ADMIN_PHONE_HASH_KEY`) - `phone_enc`: Laravel `Crypt::encryptString()` (키 = APP_KEY) --- ## 2) .env 표준화(도메인/URL) 권장 키: ```env WEB_SCHEME=https ADMIN_SCHEME=https APP_DOMAIN=four.syye.net ADMIN_DOMAIN=shot.syye.net APP_URL=${WEB_SCHEME}://${APP_DOMAIN} APP_ADMIN_URL=${ADMIN_SCHEME}://${ADMIN_DOMAIN} ADMIN_ALLOWED_IPS=210.96.177.79 ADMIN_PHONE_HASH_KEY=change-me-long-random ADMIN_OTP_TTL=300 ADMIN_OTP_MAX_ATTEMPTS=5 ADMIN_SMS_TTL=180 ADMIN_REDIS_PREFIX=admin:2fa: