2.7 KiB
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미들웨어를 반드시 적용한다. .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: LaravelCrypt::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: