TIL · 잡담

Ory IAM 인증 시스템 구축 - 웹 & 앱 로그인 흐름

devhyen 2025. 4. 4. 13:38
👑 목차 🎀
    반응형

     

     

    최근 회사에서 인증 시스템을 구축하게 되면서 Ory 기반의 IAM(Identity and Access Management) 솔루션을 도입하게 되었다.

    상용 서비스인 Ory Network는 유료 플랜이기 때문에, 우리는 Ory의 오픈소스 프로젝트만 활용하여 Self-hosting 방식으로 구성하기로 결정했다.

    또한, 기본으로 제공되는 Kratos UI 대신 우리 서비스에 맞는 커스텀 UI(Spring 기반) 를 직접 만들어 연동하는 방향으로 개발을 진행하게 되었다.

     

     

    web/app ory kratos 의 로그인 플로우

    앞선 흐름도에서 알 수 있듯, 웹과 모바일 앱은 Kratos와 통신할 때 사용하는 엔드포인트(URL)가 서로 다르다.

     

     

    나는 웹 UI 쪽을 담당하고 있기 때문에, 우선 웹 기반 인증 흐름부터 중심적으로 테스트를 진행할 예정이다.

    다만, 모바일 앱에서도 Kratos를 활용한 인증이 필요하기 때문에, 앱과 웹의 인증 플로우 차이를 함께 정리해 두었다.

    앱 개발은 타 팀에서 맡고 있지만, 앱 연동 가이드를 제공하기 위해 샘플 코드도 직접 작성해볼 계획이다.

     

     

    kratos 환경 구성 및 실행 가이드 

    이번 로그인 시스템에서는 Kratos만 사용해도 되지만,
    실제 서비스에 적용할 땐 Oathkeeper 등의 API Gateway를 앞단에 두는 것이 좋다.
    Kratos는 인증 서버이지만 자체적으로 API 접근 제어 기능이 없기 때문이다.

     

    kratos 설치 (Docker)

    docker pull oryd/kratos:v1.3.1
    docker run --rm -it oryd/kratos:v1.3.1 help

    Kratos는 API 전용 서버로, UI나 템플릿 엔진은 포함되어 있지 않다.

    📌 참고:
    Kratos와 UI 앱이 CSRF 토큰 및 세션을 제대로 주고받으려면 동일한 도메인/쿠키 환경을 공유해야 한다.
    로컬에서는 localhost의 다른 포트로 실행되므로 별도 설정은 필요 없지만, 도메인 분리 또는 리버스 프록시 환경에서는 쿠키 설정이 복잡해질 수 있다.

     

    👉 멀티 도메인 쿠키 가이드 보기

    또한, Kratos는 관리자 UI를 따로 제공하지 않기 때문에, 필요한 경우 직접 만들어야 한다.

     

    사용할 DB : SQLite

    kratos 지원 DB 종류

    • PostgreSQL
    • MySQL / MariaDB
    • SQLite
    SQL Lite는 Kratos 컨테이너에 드라이버가 내장되어있어 별도 설치 없이 파일 하나로 실행가능하기 때문에
    로컬 테스트용으로 적합하다.
    UI를 로컬에서 개발해서 보는데에만 필요하기 때문에 로컬에서 할 때는 
    SQLite를 사용하기로 했다. 

     

     

    폴더 구조 (wsl 우분투 기준)

    identity.schema.json (사용자 스키마) 

    {
      "$id": "https://example.com/identity.schema.json",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "title": "User",
      "type": "object",
      "properties": {
        "traits": {
          "type": "object",
          "properties": {
            "email": {
              "type": "string",
              "format": "email"
            }
          },
          "required": ["email"]
        }
      }
    }

     

    kratos.yml (kratos 설정 파일)

    dsn: sqlite:///var/lib/sqlite/db.sqlite?_fk=true
    
    selfservice:
      default_browser_return_url: http://localhost:4455/welcome
      flows:
        login:
          ui_url: http://localhost:4455/login
        registration:
          ui_url: http://localhost:4455/registration
    
    identity:
      schemas:
        - id: default
          url: file:///etc/config/identity.schema.json
    
    serve:
      public:
        base_url: http://localhost:4433
      admin:
        base_url: http://localhost:4434
    
    log:
      level: debug
      format: json

     

    파일과 폴더를 만든 후 

    DB 마이그레이션 후에 kratos를 실행하면 된다. 

     

    DB마이그레이션

    docker run --rm \
      -v /root/kratos-local:/etc/config \
      -v /root/kratos-local/sqlite-data:/var/lib/sqlite \
      oryd/kratos:v1.3.1 \
      migrate sql sqlite:///var/lib/sqlite/db.sqlite?_fk=true --yes

     

    kratos 실행 (로컬 dev 모드)

    docker run --rm \
      -v /root/kratos-local:/etc/config \
      -v /root/kratos-local/sqlite-data:/var/lib/sqlite \
      -p 4433:4433 \
      -p 4434:4434 \
      oryd/kratos:v1.3.1 \
      serve -c /etc/config/kratos.yml --dev

     

     

    이렇게 실행한 후 브라우저로 

     

    http://localhost:4433/self-service/login/browser 를 접속하게 되면 

    http://localhost:4455/login?flow=a123 으로 리디렉션 되게 되며 

     

    kratos-selfservice-ui-node를 띄워둔 상태라면 

     

    ory 기본 UI 가 뜨게 된다.

     

    UI 커스텀은 다음에 정리...

    반응형