giftcon_dev/docs/ADMIN/ADMIN_AUTH_PLAN.md
2026-02-04 16:55:00 +09:00

2.7 KiB

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 미들웨어를 반드시 적용한다.
  • .envADMIN_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)

권장 키:

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: