Sentivex Auth
auth.in-bridge.com패밀리 공통 OAuth2/OIDC 인증 서버. 조직·역할·스코프·테넌트를 전 제품에 발급한다.
개요
Sentivex Auth 는 패밀리(Sentivex·SEE·SIT·SCTI·이 랜딩)의 공용 IdP 입니다. 어느 한 곳에서 로그인하면 IdP 세션이 생기고, 다른 제품들이 자동 인증됩니다. IdP 는 조직 광역 역할(브로드롤)만 토큰/userinfo 클레임으로 발급하고, 제품별 세분 권한은 각 제품이 로컬로 해석합니다 — 브로드롤 키는 Sentivex 퍼스펙티브 키와 100% 동일한 계약입니다.
| 책임 | 내용 |
|---|---|
| SSO / OIDC | authorize → token → userinfo 표준 플로우, 패밀리 전 제품의 로그인 근원 |
| 역할·스코프 | 브로드롤 발급(=퍼스펙티브 계약) · 제품별 스코프 시드(pm:*·ti:*·see:* 환산의 원본) |
| 구독·테넌트 | subscription_status(suspended 차단)·plan·entitlements 클레임, 테넌트=SSO/렐름 경계 |
| 메뉴 카탈로그 | 제품별 메뉴 카탈로그 API — 각 제품 상단 네비가 이걸 소비(하드코딩 금지) |
OIDC 플로우
이 랜딩 사이트 자체가 auth 의 실제 OIDC 클라이언트입니다 — 아래 플로우는 이 사이트의 로그인 버튼이 실제로 밟는 경로입니다.
| 단계 | 내용 |
|---|---|
| 1. authorize | 클라이언트가 state 를 만들고 IdP authorize URL 로 리다이렉트 |
| 2. 로그인/동의 | 사용자가 IdP 에서 인증 — 여기서 IdP 글로벌 SSO 세션이 생성됨 |
| 3. callback | code 수신 → 서버간 token 교환 → userinfo 조회 |
| 4. 앱 세션 | 각 제품이 자기 세션(서명 쿠키 등)을 발급 — 형태는 제품별(랜딩=see_id, Sentivex=svx_session, SIT=token, SCTI=ops_session+ti_id, SEE=see_session) |
소비자 구현 팁(이 레포 실측): 프록시 뒤에서는 x-forwarded-host/proto 로 공개 origin 을 복원해 redirect_uri 를 IdP 등록값과 일치시켜야 하고(localhost 누출 금지), token/userinfo 응답은 {data} 봉투·bare 양쪽을 방어적으로 언랩해야 합니다.
API 카탈로그
정본은 auth 오리진(Swagger auth.in-bridge.com/docs · ENDPOINTS-REFERENCE.md). 아래는 그룹·prefix 소개, 상세는 로그인 후.
| 그룹 | prefix | 용도 |
|---|---|---|
| 인증/토큰 | /api/v1/auth | 로그인·로그아웃·토큰 갱신·MFA |
| OAuth2/OIDC | /oauth/* · /.well-known/* | authorize·token·consent·Discovery·JWKS |
| 사용자 | /api/v1/users | 사용자 CRUD |
| 조직/부서 | /api/v1/organizations | 조직·조직도 |
| 세션 | /api/v1/sessions | 활성 세션 조회/철회 |
| 카탈로그 | /api/v1/catalog | 메뉴·역할·스코프·벤더·plans·tenants (공개 read) |
| 테넌트 | /api/v1/tenants | 테넌트·라이선스·멤버·SSO·초대 |
| 연합 SSO | /api/v1/sso · /sso · /scim/v2 | 소셜/OIDC·LDAP·SAML·SCIM |
| 관리(super_admin) | /api/v1/admin/* | oauth-clients·users·tenants·audit-logs·realms |
에러 · rate limit
표준 응답: { success:false, error:{ code, message, details }, meta } — 제품별 포맷 상이(SIT 는 {error,code}, auth 는 {success,error{}}).
| 코드 | HTTP | 의미 |
|---|---|---|
| AUTH_INVALID_CREDENTIALS | 401 | 자격증명 불일치 |
| AUTH_ACCOUNT_LOCKED | 401/403 | 5회 실패 계정 잠금 |
| AUTH_ACCOUNT_SUSPENDED | 403 | 계정 정지 |
| AUTH_TOKEN_EXPIRED / _INVALID / _REVOKED | 401 | 토큰 만료/무효/철회(블랙리스트) |
| AUTH_REFRESH_TOKEN_INVALID | 400/401 | refresh token 무효 |
| AUTH_MFA_REQUIRED / _INVALID | 401 | MFA 필요/코드 오류 |
| AUTH_UNAUTHORIZED / AUTH_FORBIDDEN | 401/403 | 인증 필요 / 권한 없음 |
| USER_NOT_FOUND / USER_EMAIL_ALREADY_EXISTS | 404/409 | 사용자 없음/이메일 중복 |
| ORG_* (NOT_FOUND · SLUG · MEMBER) | 404/409 | 조직 없음/slug·멤버 중복 |
| APP_SEAT_LIMIT_EXCEEDED | 403 | 멤버추가 seat 한도 초과(라이선스) |
| APP_INVITATION_EXPIRED / _ALREADY_ACCEPTED | 410/409 | 초대 만료/이미 수락 |
| SESSION_NOT_FOUND / SESSION_EXPIRED | 404/401 | 세션 없음/만료 |
| TENANT_NOT_FOUND | 404 | 테넌트 없음 |
| VALIDATION_ERROR | 400 | 입력 검증 실패(details[]) |
| RATE_LIMIT_EXCEEDED | 429 | 레이트리밋 초과 |
| INTERNAL_ERROR | 500 | 내부 오류 |
OAuth2 에러(/oauth/token 등, RFC 6749): invalid_request · invalid_client · invalid_grant · unauthorized_client · unsupported_grant_type · unsupported_response_type · invalid_scope · access_denied · server_error · temporarily_unavailable.
앱별 스코프
| 앱 | 스코프 | 의미 |
|---|---|---|
| inbridge-auth | auth:read | 자기 신원·세션·권한 조회 (전 역할 기본 보유) |
| inbridge-auth | auth:tenant | 테넌트 멤버·SSO·앱·초대 관리 |
| inbridge-auth | auth:admin | 클라이언트·테넌트·카탈로그·감사 전역 관리(super_admin) |
| index-pm | pm:read · pm:write · pm:respond · pm:admin | 조회 · 작성 · 인시던트 대응/HITL · 워크스페이스 관리 |
| see | see:read · see:analyze · see:respond · see:admin | 분석 조회 · 분석 실행(멀티렌즈) · HITL/SIT 전환 · 파이프라인 설정 |
| ti-app | ti:read · ti:write · ti:hunt | IOC 조회 · 해시/benign 등록·상관 · 위협 헌팅/파이프라인 |
| sentivex | (스코프 없음) | 메뉴 가시성(role×menu, 82메뉴×9역할)으로 통제 |
역할 × 스코프 매트릭스
| 역할 | auth | index-pm (pm) | see | ti-app (ti) |
|---|---|---|---|---|
| analyst | read | read,write,respond | read,analyze,respond | read,write |
| hunter | read | read,write | read,analyze | read,write,hunt |
| ciso | read | read | read | read |
| responder | read | read,write,respond | read,respond | read,write |
| general | read | read | — | read |
| pm | read | admin,read,write | — | read |
| sales | read | read | — | read |
| tenant | read,tenant | admin,read,respond,write | admin,analyze,read,respond | read,write,hunt |
| super | admin,read,tenant | admin,read,respond,write | admin,analyze,read,respond | read,write,hunt |
| super_admin | admin,read,tenant | — | — | — |
MSSP 테넌트 스코프(#44): userinfo 가 allowed_tenants: string[](접근 가능한 enrich tenant_name 목록)을 발급 — 원천은 tenants.settings.dataTenants(jsonb). 데모 MSSP(sentivex-demo) = [in-bridge, hanssem, kumho]. 회귀 검증 스크립트: scripts/verify-userinfo-claims.mjs.
테스트 계정
3계층: ① 시스템역할 super_admin(IdP 전역) ② perspective 역할(제품 스코프·메뉴) ③ 테넌트역할 owner/admin/developer.
| 이름 | 이메일 | 테넌트 | perspective | 시스템/테넌트 역할 | 접근 앱 |
|---|---|---|---|---|---|
| System Admin | [email protected] | InBridge System | - | super_admin / owner | auth(전역)+전 제품 |
| 윤덕진 | [email protected] | InBridge System | super | super_admin / - | sentivex·sit·see·scti |
| 관리자 데모 | [email protected] | Sentivex | super | - / admin | sentivex·sit·see·scti |
| 김옥현 | [email protected] | Sentivex | tenant | - / owner | sentivex·sit·see·scti |
| 박서준 | [email protected] | Sentivex | analyst | - / developer | sentivex·sit·see·scti |
| 이지우 | [email protected] | Sentivex | analyst | - / developer | sentivex·sit·see·scti |
| 최민서 | [email protected] | Sentivex | analyst | - / developer | sentivex·sit·see·scti |
| 이하나 | [email protected] | Sentivex | hunter | - / developer | sentivex·sit·see·scti |
| 정도윤 | [email protected] | Sentivex | hunter | - / developer | sentivex·sit·see·scti |
| 강시우 | [email protected] | Sentivex | hunter | - / developer | sentivex·sit·see·scti |
| 임하준 | [email protected] | Sentivex | ciso | - / developer | sentivex·sit·see·scti |
| 윤서연 | [email protected] | Sentivex | ciso | - / developer | sentivex·sit·see·scti |
| 오유진 | [email protected] | Sentivex | responder | - / developer | sentivex·sit·see·scti |
| 신아린 | [email protected] | Sentivex | responder | - / developer | sentivex·sit·see·scti |
| 배준우 | [email protected] | Sentivex | general | - / developer | sentivex·sit·scti |
| 조은서 | [email protected] | Sentivex | general | - / developer | sentivex·sit·scti |
| 권태오 | [email protected] | Sentivex | pm | - / developer | sentivex·sit·scti |
| 남도현 | [email protected] | Sentivex | pm | - / developer | sentivex·sit·scti |
| 서나윤 | [email protected] | Sentivex | sales | - / developer | sentivex·sit·scti |
| 백승호 | [email protected] | Sentivex | sales | - / developer | sentivex·sit·scti |
| Alice Kim | [email protected] | Acme Store | - | - / owner | 자기 테넌트만 |
| Bob Park | [email protected] | Acme Store | - | - / admin | 자기 테넌트만 |
| Carol Choi | [email protected] | Acme Store | - | - / developer | 자기 테넌트만 |
| Dave Yoon | [email protected] | Acme Store | - | - / developer | 자기 테넌트만 |
| Sarah Oh | [email protected] | Nexus HR | - | - / owner | 자기 테넌트만 |
| James Park | [email protected] | Nexus HR | - | - / admin | 자기 테넌트만 |
| Emily Kim | [email protected] | Nexus HR | - | - / developer | 자기 테넌트만 |
| Michael Lee | [email protected] | Nexus HR | - | - / developer | 자기 테넌트만 |
역할별 대표 계정: analyst=sj.park · hunter=ha.lee · ciso=hj.lim · responder=yj.oh · general=jw.bae · pm=to.kwon · sales=ny.seo · tenant=ok.kim(owner) · super=admin.demo · [email protected].
브로드롤 계약
IdP 가 발급하는 브로드롤 9종(analyst/hunter/ciso/responder/general/pm/tenant/super/sales)은 각 제품에서 로컬 환산됩니다 — SIT: pm:* 스코프 환산표(role-scopes.ts, IdP 시드와 100% 일치 계약) · SCTI: userinfo scopes['ti-app'] → ti:read/write/hunt · SEE: see/sxe 롤 게이트 + X-Required-Scope. 각 제품 페이지의 인증 섹션에 제품별 상세가 있습니다.
userinfo 공통 클레임 계약(소비자 실측 종합): roles[](브로드롤) · entitlements[](제품 접근 게이트, 예: ti-app) · subscription_status(suspended=차단, active/trial/grace=통과) · plan(메뉴 min_plan 소비 예정) · scopes{제품별}. 계약 SoT 는 inbridge-auth oauth.routes.ts + README §4, 테스트 계정은 docs/ACCOUNTS-MATRIX.md(비밀번호 평문 복제 금지).