snow · 2026.5.27 13:46 · 조회 1
Logto 프로덕션 배포
LogtoIAM프로덕션보안Docker배포
Logto를 실제 서비스 환경에 배포하기 전에 반드시 확인해야 할 보안 체크리스트, Docker/Kubernetes 기반 배포 방법, 그리고 운영 중 모니터링 방법을 안내합니다.
8.1 프로덕션 보안 체크리스트
배포 전 아래 항목을 반드시 확인하십시오.
필수 보안 항목
| 항목 | 확인 방법 | 중요도 |
|---|---|---|
| HTTPS 적용 | 모든 엔드포인트에 TLS/SSL 인증서 적용 | 🔴 필수 |
| 강력한 DB 비밀번호 | 16자 이상, 특수문자 포함 | 🔴 필수 |
| 환경변수 분리 | .env 파일을 git에 커밋하지 않음 | 🔴 필수 |
| Redirect URI 제한 | 와일드카드(*) 사용 금지, 명시적 URL만 허용 | 🔴 필수 |
| CORS 설정 | 허용 도메인을 명시적으로 제한 | 🔴 필수 |
| Cookie 보안 | Secure, HttpOnly, SameSite 플래그 설정 | 🔴 필수 |
| Rate Limiting | 로그인 시도 횟수 제한 | 🟡 권장 |
| 감사 로그 보관 | 최소 90일 이상 | 🟡 권장 |
| MFA 강제 적용 | 관리자 계정에 필수 | 🟡 권장 |
Redirect URI 보안 예시
❌ 잘못된 설정:
https://*.yourapp.com/callback (와일드카드 사용 금지)
http://yourapp.com/callback (HTTP 금지)
✅ 올바른 설정:
https://app.yourapp.com/callback
https://www.yourapp.com/callback
환경변수 관리
1# .env.production (절대 git에 포함하지 마십시오)2DB_URL=postgresql://logto:STRONG_PASS@db-host:5432/logto3LOGTO_SECRET=your-32-char-random-secret4ADMIN_ENDPOINT=https://admin.yourcompany.com5ENDPOINT=https://auth.yourcompany.com6 7# 랜덤 시크릿 생성8openssl rand -base64 328.2 Docker 프로덕션 배포
프로덕션용 docker-compose.yml
1version: '3.9'2 3services:4 postgres:5 image: postgres:15-alpine6 restart: unless-stopped7 environment:8 POSTGRES_DB: logto9 POSTGRES_USER: logto10 POSTGRES_PASSWORD: ${DB_PASSWORD}11 volumes:12 - postgres_data:/var/lib/postgresql/data13 networks:14 - internal15 healthcheck:16 test: ["CMD-SHELL", "pg_isready -U logto"]17 interval: 10s18 timeout: 5s19 retries: 520 21 logto:22 image: svhd/logto:latest23 restart: unless-stopped24 depends_on:25 postgres:26 condition: service_healthy27 networks:28 - internal29 - public30 environment:31 DB_URL: postgresql://logto:${DB_PASSWORD}@postgres:5432/logto32 ENDPOINT: https://auth.yourcompany.com33 ADMIN_ENDPOINT: https://admin.yourcompany.com34 LOGTO_SECRET: ${LOGTO_SECRET}35 expose:36 - "3000"37 - "3001"38 39 nginx:40 image: nginx:alpine41 restart: unless-stopped42 ports:43 - "443:443"44 - "80:80"45 volumes:46 - ./nginx.conf:/etc/nginx/nginx.conf:ro47 - ./ssl:/etc/ssl/certs:ro48 depends_on:49 - logto50 networks:51 - public52 53volumes:54 postgres_data:55 56networks:57 internal:58 driver: bridge59 public:60 driver: bridgenginx.conf 예시
1server {2 listen 443 ssl http2;3 server_name auth.yourcompany.com;4 5 ssl_certificate /etc/ssl/certs/fullchain.pem;6 ssl_certificate_key /etc/ssl/certs/privkey.pem;7 ssl_protocols TLSv1.2 TLSv1.3;8 9 location / {10 proxy_pass http://logto:3000;11 proxy_set_header Host $host;12 proxy_set_header X-Real-IP $remote_addr;13 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;14 proxy_set_header X-Forwarded-Proto $scheme;15 }16}17 18server {19 listen 443 ssl http2;20 server_name admin.yourcompany.com;21 22 ssl_certificate /etc/ssl/certs/fullchain.pem;23 ssl_certificate_key /etc/ssl/certs/privkey.pem;24 25 allow 10.0.0.0/8;26 deny all;27 28 location / {29 proxy_pass http://logto:3001;30 proxy_set_header Host $host;31 proxy_set_header X-Real-IP $remote_addr;32 }33}데이터베이스 초기화 및 마이그레이션
1# 첫 배포 시: DB 초기화 및 시드2docker compose run --rm logto npm run cli db seed -- --swe3 4# 버전 업그레이드 시: 마이그레이션 실행5docker compose run --rm logto npm run cli db alteration deploy next8.3 Kubernetes 배포
Helm Chart를 이용한 배포 (권장)
1helm repo add logto https://charts.logto.io2helm repo update3 4cat > values.yaml << EOF5replicaCount: 26 7image:8 repository: svhd/logto9 tag: latest10 11config:12 endpoint: "https://auth.yourcompany.com"13 adminEndpoint: "https://admin.yourcompany.com"14 15database:16 url: "postgresql://logto:password@postgres-service:5432/logto"17 18ingress:19 enabled: true20 className: nginx21 hosts:22 - host: auth.yourcompany.com23 paths: [{ path: /, pathType: Prefix, port: 3000 }]24 - host: admin.yourcompany.com25 paths: [{ path: /, pathType: Prefix, port: 3001 }]26 tls:27 - secretName: logto-tls28 hosts: [auth.yourcompany.com, admin.yourcompany.com]29 30resources:31 requests:32 cpu: 500m33 memory: 512Mi34 limits:35 cpu: 1000m36 memory: 1Gi37EOF38 39helm install logto logto/logto -n logto --create-namespace -f values.yamlPostgreSQL 고가용성 권장 구성
권장 DB 옵션:
- Cloud: AWS RDS PostgreSQL, Google Cloud SQL, Azure Database for PostgreSQL
- Self-hosted: Patroni + pgBouncer, Citus, Supabase
- 최소 사양: 2 vCPU, 4GB RAM, 50GB SSD
8.4 모니터링 및 운영
Audit Log 활용
Admin Console → Audit logs에서 모든 인증/인가 이벤트를 확인할 수 있습니다.
| 이벤트 | 의미 | 대응 |
|---|---|---|
PostSignIn (실패 반복) | 브루트포스 시도 가능성 | IP 차단 검토 |
User.SuspensionStatusUpdated | 계정 정지/복구 | 내부 감사 기록 |
Role.Scopes.Updated | 권한 변경 | 변경 승인 절차 확인 |
Organization.Membership.Updated | 조직 멤버 변경 | 인가된 변경인지 확인 |
Webhook으로 외부 SIEM 연동
1app.post('/siem/logto', (req, res) => {2 const event = req.body;3 4 siemClient.ingest({5 source: 'logto',6 event: event.event,7 userId: event.data?.userId,8 ip: event.ip,9 userAgent: event.userAgent,10 timestamp: event.createdAt,11 });12 13 res.status(200).send();14});백업 전략
1#!/bin/bash2DATE=$(date +%Y%m%d_%H%M%S)3BACKUP_DIR=/backups/logto4 5docker exec logto-postgres pg_dump -U logto logto \6 | gzip > "${BACKUP_DIR}/logto_${DATE}.sql.gz"7 8find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete9 10aws s3 cp "${BACKUP_DIR}/logto_${DATE}.sql.gz" s3://your-backup-bucket/logto/8.5 업그레이드 절차
1# 1. 이미지 업데이트2docker compose pull logto3 4# 2. DB 마이그레이션 실행5docker compose run --rm logto npm run cli db alteration deploy next6 7# 3. 서비스 재시작8docker compose up -d logto9 10# 4. 헬스체크11curl https://auth.yourcompany.com/api/status마무리
이 가이드를 통해 Logto를 도입하여 프로덕션 환경까지 배포하는 전 과정을 다루었습니다.
| 파트 | 내용 |
|---|---|
| 1 — Logto 시작하기 | Cloud/셀프호스팅 선택, 테넌트 설정 |
| 2 — Logto 첫 번째 앱 연동 | SDK 설치, 로그인/로그아웃, 콜백 처리 |
| 3 — Logto 인증 방식 설정 | 이메일, 소셜, OTP, MFA |
| 4 — Logto 사용자 관리 | Admin Console, Management API, Webhook |
| 5 — Logto 인가 설정 | API 리소스, RBAC, 토큰 검증 |
| 6 — Logto 멀티 테넌트 | Organizations, JIT 프로비저닝 |
| 7 — Logto 로그인 UI 커스터마이징 | 브랜딩, CSS, 커스텀 도메인 |
| 8 — Logto 프로덕션 배포 | 보안 체크리스트, Docker, K8s, 모니터링 |
문의 사항은 Logto Discord 커뮤니티 또는 GitHub Issues를 활용하십시오.
참고: Logto 공식 문서 — https://docs.logto.io
댓글
아직 댓글이 없습니다.
댓글을 작성하려면 로그인이 필요합니다.