snow · 2026.5.28 03:31 · 조회 2
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
환경변수 관리
# .env.production (절대 git에 포함하지 마십시오)
DB_URL=postgresql://logto:STRONG_PASS@db-host:5432/logto
LOGTO_SECRET=your-32-char-random-secret
ADMIN_ENDPOINT=https://admin.yourcompany.com
ENDPOINT=https://auth.yourcompany.com
# 랜덤 시크릿 생성
openssl rand -base64 32
8.2 Docker 프로덕션 배포
프로덕션용 docker-compose.yml
version: '3.9'
services:
postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_DB: logto
POSTGRES_USER: logto
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- internal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U logto"]
interval: 10s
timeout: 5s
retries: 5
logto:
image: svhd/logto:latest
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
networks:
- internal
- public
environment:
DB_URL: postgresql://logto:${DB_PASSWORD}@postgres:5432/logto
ENDPOINT: https://auth.yourcompany.com
ADMIN_ENDPOINT: https://admin.yourcompany.com
LOGTO_SECRET: ${LOGTO_SECRET}
expose:
- "3000"
- "3001"
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- "443:443"
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/ssl/certs:ro
depends_on:
- logto
networks:
- public
volumes:
postgres_data:
networks:
internal:
driver: bridge
public:
driver: bridge
nginx.conf 예시
server {
listen 443 ssl http2;
server_name auth.yourcompany.com;
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/certs/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://logto:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl http2;
server_name admin.yourcompany.com;
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/certs/privkey.pem;
allow 10.0.0.0/8;
deny all;
location / {
proxy_pass http://logto:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
데이터베이스 초기화 및 마이그레이션
# 첫 배포 시: DB 초기화 및 시드
docker compose run --rm logto npm run cli db seed -- --swe
# 버전 업그레이드 시: 마이그레이션 실행
docker compose run --rm logto npm run cli db alteration deploy next
8.3 Kubernetes 배포
Helm Chart를 이용한 배포 (권장)
helm repo add logto https://charts.logto.io
helm repo update
cat > values.yaml << EOF
replicaCount: 2
image:
repository: svhd/logto
tag: latest
config:
endpoint: "https://auth.yourcompany.com"
adminEndpoint: "https://admin.yourcompany.com"
database:
url: "postgresql://logto:password@postgres-service:5432/logto"
ingress:
enabled: true
className: nginx
hosts:
- host: auth.yourcompany.com
paths: [{ path: /, pathType: Prefix, port: 3000 }]
- host: admin.yourcompany.com
paths: [{ path: /, pathType: Prefix, port: 3001 }]
tls:
- secretName: logto-tls
hosts: [auth.yourcompany.com, admin.yourcompany.com]
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
EOF
helm install logto logto/logto -n logto --create-namespace -f values.yaml
PostgreSQL 고가용성 권장 구성
권장 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 연동
app.post('/siem/logto', (req, res) => {
const event = req.body;
siemClient.ingest({
source: 'logto',
event: event.event,
userId: event.data?.userId,
ip: event.ip,
userAgent: event.userAgent,
timestamp: event.createdAt,
});
res.status(200).send();
});
백업 전략
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backups/logto
docker exec logto-postgres pg_dump -U logto logto \
| gzip > "${BACKUP_DIR}/logto_${DATE}.sql.gz"
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
aws s3 cp "${BACKUP_DIR}/logto_${DATE}.sql.gz" s3://your-backup-bucket/logto/
8.5 업그레이드 절차
# 1. 이미지 업데이트
docker compose pull logto
# 2. DB 마이그레이션 실행
docker compose run --rm logto npm run cli db alteration deploy next
# 3. 서비스 재시작
docker compose up -d logto
# 4. 헬스체크
curl 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
댓글
아직 댓글이 없습니다.
댓글을 작성하려면 로그인이 필요합니다.