guides
SSO 통합 가이드
Modfolio Connect SDK를 사용한 SSO 연동 전체 가이드
SSO 통합 가이드
개요
Modfolio Connect는 생태계 전체의 유니버설 SSO/OIDC 플랫폼입니다.
login.modfolio.io에서 운영되며, 15개 이상의 앱이 하나의 계정으로 인증을 처리합니다.
- 프로토콜: OpenID Connect (OIDC) Authorization Code Flow + PKCE S256
- 구현: SvelteKit 5 + Better Auth + D1
- 엔드포인트:
https://connect.modfolio.io
사용자는 한 번 로그인하면 생태계 내 모든 앱에 별도 인증 없이 접근할 수 있습니다.
OIDC Authorization Code + PKCE 플로우
PKCE(Proof Key for Code Exchange)는 public client에서 Authorization Code 가로채기 공격을 방지합니다.
1. 앱 → code_verifier(랜덤) 생성 → SHA-256 해시 → code_challenge
2. 앱 → GET /sso/authorize
?client_id=your-app
&response_type=code
&redirect_uri=https://your-app.com/auth/callback
&scope=openid+profile+email
&code_challenge=<hash>
&code_challenge_method=S256
3. Connect → 사용자에게 로그인 UI 표시 → 인증 처리
4. Connect → redirect_uri?code=<authorization_code>
5. 앱 → POST /sso/token
{ code, code_verifier, redirect_uri, grant_type: "authorization_code" }
6. Connect → { access_token, id_token, refresh_token, token_type, expires_in }
7. 앱 → JWT 검증 후 세션 생성
Connect SDK를 사용하면 위 플로우가 자동으로 처리됩니다. 직접 구현할 필요가 없습니다.
인증 방식
Modfolio Connect는 5가지 인증 방식을 지원합니다.
| 방식 | 설명 | 비고 |
|---|---|---|
| 비밀번호 | 이메일 + 비밀번호 | 기본 인증 |
| Kakao OAuth | 카카오 소셜 로그인 | 한국 사용자 대상 |
| Magic Link | 이메일 일회용 링크 | Resend로 발송 |
| Passkey | WebAuthn/FIDO2 생체인증 | 기기 바인딩 |
| TOTP 2FA | Google Authenticator 등 | 2차 인증 |
앱은 인증 방식을 선택할 필요가 없습니다. Connect 로그인 화면에서 사용자가 직접 선택합니다.
토큰 라이프사이클
access_token ─── 15분 ───┐
├── 만료 시 자동 갱신 (SDK 미들웨어)
refresh_token ─── 90일 ───┘
- access_token (15분): API 요청 인증에 사용. 짧은 수명으로 탈취 위험 최소화.
- refresh_token (90일): access_token 만료 시 새 토큰 쌍 발급에 사용.
- SDK 미들웨어는 access_token 만료를 감지하고 refresh_token으로 자동 갱신합니다.
- refresh_token마저 만료되면 사용자에게 재로그인을 요청합니다.
JWT Claims 구조
access_token을 디코딩하면 다음 클레임을 포함합니다.
interface ConnectJWTPayload {
/** 발급자 — 항상 https://connect.modfolio.io */
iss: "https://connect.modfolio.io";
/** 사용자 고유 ID (UUID) */
sub: string;
/** 대상 앱의 client_id */
aud: string;
/** 만료 시각 (Unix timestamp) */
exp: number;
/** 발급 시각 (Unix timestamp) */
iat: number;
/** 사용자 ID (sub과 동일) */
user_id: string;
/** 이메일 주소 */
email: string;
/** 역할 목록 (예: ["user", "admin"]) */
roles: string[];
/** 연결된 앱 목록 (예: ["naviaca", "gistcore"]) */
connected_apps: string[];
}
roles와 connected_apps는 생태계 내 권한 관리와 앱 간 연결 상태 확인에 사용됩니다.
Well-Known Endpoints
OIDC Discovery를 통해 클라이언트가 자동으로 설정을 가져올 수 있습니다.
| 엔드포인트 | 설명 |
|---|---|
GET /.well-known/openid-configuration |
OIDC Discovery 문서 |
GET /.well-known/jwks.json |
공개키 세트 (JWK Set, EC P-256) |
주요 SSO 엔드포인트:
| 엔드포인트 | 메서드 | 설명 |
|---|---|---|
/sso/authorize |
GET | OIDC Authorization 시작 |
/sso/token |
POST | Authorization Code를 토큰으로 교환 |
/sso/verify |
POST | JWT 서명 검증 |
/sso/introspect |
POST | 토큰 인트로스펙션 (RFC 7662) |
/sso/revoke |
POST | 토큰 폐기 (RFC 7009) |
/sso/userinfo |
GET | 사용자 정보 조회 |
/sso/consent |
POST | 사용자 동의 처리 |
/logout |
POST | 로그아웃 + Back-Channel Logout |
/health |
GET | 서버 상태 확인 |