최근 회사에서 인증 시스템을 구축하게 되면서 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 커스텀은 다음에 정리...
'TIL · 잡담' 카테고리의 다른 글
무료 폼 빌더 Tally 를 소개합니다 (설문조사 간지나게 만들기) (0) | 2025.07.04 |
---|---|
VS Code 단축키 정리 (0) | 2025.03.31 |
정규 표현식(Regex) 완벽 가이드 (0) | 2024.07.01 |
KMP 알고리즘 (Knuth-Morris-Pratt Algorithm) (0) | 2024.06.22 |
Longest Common Subsequence (0) | 2024.06.20 |