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

댓글

아직 댓글이 없습니다.

댓글을 작성하려면 로그인이 필요합니다.