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 커스텀은 다음에 정리...