K

SSO 사용자 정보 읽기

앱은 로그인 기능을 직접 만들 필요가 없어요. 지금 접속한 사람이 누구인지 SDK나 SSO 헤더로 읽는 방법이에요.

AxHub 뒤에 있는 앱은 로그인 기능을 직접 만들 필요가 없어요.
지금 앱에 들어온 사람이 누구인지 읽어서, 사람마다 다른 화면과 데이터를 보여 주면 돼요.

원리는 한 줄이에요. 앱 앞을 지키는 게이트가 로그인을 대신 확인하고, 통과한 요청에만 "이 사람이 누구인지"를 적은 꼬리표 6개를 붙여서 앱에 넘겨 줘요. 이 꼬리표를 SSO 헤더라고 불러요.

사용자요청게이트로그인 검사통과 시 헤더 6개 추가내 앱통과한 요청에 붙는 헤더 6개X-AxHub-User-IDX-AxHub-User-EmailX-AxHub-User-NameX-AxHub-App-RoleX-AxHub-Is-AdminX-AxHub-Tenant-Slug
게이트를 지난 요청에 사용자 정보가 헤더로 담기는 흐름

템플릿으로 만든 앱이라면

Next.js · Astro 템플릿은 SDK로 읽는 방식이 이미 붙어 있어요.

import { makeAxhub } from '@/lib/axhub-server';

const sdk = await makeAxhub();
const me = await sdk.identity.me();
// me.email, me.name, me.tenants (소속 회사와 역할)

데이터에는 me.email처럼 사람마다 안 바뀌는 값을 열쇠로 붙여 두세요. 템플릿의 할 일 목록도 이렇게 사람별로 데이터를 나눠요.

const userKey = me?.email ?? 'local-dev';
await db()`INSERT INTO todos (user_key, title) VALUES (${userKey}, ${title})`;

읽을 때도 WHERE user_key = ${userKey}로 한 번 더 걸러요 — 남의 데이터가 섞이지 않게요.

헤더로 읽기

SDK를 안 쓰고 헤더를 직접 읽어도 돼요. 붙어서 오는 헤더 6개와 각각의 값이에요.

헤더
X-AxHub-User-ID사용자 UUID
X-AxHub-User-Emailbase64로 인코딩된 이메일
X-AxHub-User-Namebase64로 인코딩된 이름
X-AxHub-App-Roleowner · platform_admin · tenant_admin · app_member · tenant_member · guest
X-AxHub-Is-Admintrue · false
X-AxHub-Tenant-Slug테넌트 slug

서버 코드에서는 이렇게 읽어요.

export function currentAxHubUser(req: Request) {
  const h = req.headers;
  return {
    id: h.get('x-axhub-user-id'),
    email: Buffer.from(h.get('x-axhub-user-email') ?? '', 'base64').toString('utf8'),
    name: Buffer.from(h.get('x-axhub-user-name') ?? '', 'base64').toString('utf8'),
    role: h.get('x-axhub-app-role'),
    isAdmin: h.get('x-axhub-is-admin') === 'true',
    tenant: h.get('x-axhub-tenant-slug'),
  };
}

반드시 서버에서 읽으세요. 앱 바깥에서 보낸 X-AxHub-* 값은 게이트가 전부 덮어써요. 브라우저에서 왔든 터미널 명령이나 스크립트로 직접 보냈든 마찬가지예요.

헤더가 비어 있을 때

X-AxHub-User-ID가 비어 있으면 로그인하지 않은 사람으로 처리하면 돼요. 두 경우에 그래요.

  • 접근이 거부된 요청 — 6개 헤더가 모두 빈 값으로 와요
  • 전체 공개(인터넷) 앱에 익명 방문자가 들어온 경우 — 통과는 되지만 역시 6개가 다 비어 있어요

역할(App-Role)로 나누기

guest로그인은 했지만 이 앱의 멤버가 아닌 사람이에요. 전체 공개 앱에 다른 회사 사람이 들어오면 이 값을 받아요.

표에 없는 값이 오면 가장 낮은 권한으로 다루세요. 역할은 나중에 늘어날 수 있어서, 모르는 값을 관리자로 취급하면 위험해요.

SDK로 읽기

SDK로도 지금 들어온 사람이 누구인지 물어볼 수 있어요. 이메일 · 이름에 더해 소속 회사와 역할까지 한 번에 받아요.

const me = await sdk.identity.me();
// me.email, me.name, me.tenants (소속 회사와 역할)

이렇게 보이면 성공

배포된 앱에 회사 계정으로 로그인해 접속했을 때, 앱이 읽은 email · name내 계정 정보가 나오면 성공이에요.

다음은 알림 보내기에서 앱의 소식을 회사 사람들에게 보내요.