forked from baron/baron-sso
5.6 KiB
5.6 KiB
Baron SSO API Design Policy
1. 개요 (Overview)
본 문서는 Baron SSO 시스템의 백엔드 API 설계 원칙과 규약을 정의합니다. 모든 API 개발은 이 문서를 따름으로써 시스템의 일관성, 가독성, 유지보수성을 확보해야 합니다.
2. API 버전 관리 및 URL 구조 (Versioning & URI)
2.1 URL 구조
모든 API는 아래의 기본 구조를 따릅니다.
[GET|POST|...] /api/{version}/{namespace}/{resource}[/{id}][/{action}]
- Version:
v1,v2등 메이저 버전 단위로 관리합니다. - Namespace: API의 사용 목적과 권한 범위를 구분합니다.
/auth: 인증, 로그인, 비밀번호 찾기 등 (Public/User context)/user: 사용자 마이페이지, 프로필 수정 (Self-service, User context)/admin: 시스템 관리자 기능 (Admin context, Tenant aware)/dev: 개발자 포털 기능 (Developer context, RP management)
- Resource: 리소스명은 복수형(Plural) 명사를 사용합니다. (예:
clients,audit-logs)
2.2 명명 규칙 (Naming Conventions)
- URL Path: kebab-case (소문자, 하이픈 사용)
GET /api/v1/audit-logs(O)GET /api/v1/auditLogs(X)
- Query Parameters: snake_case 또는 camelCase를 허용하되, camelCase를 권장합니다.
GET /clients?clientId=...
- JSON Fields: camelCase를 엄격히 준수합니다. (프론트엔드 JS/TS/Dart 표준 준수)
{ "clientId": "...", "createdAt": "..." }(O){ "client_id": "...", "created_at": "..." }(X)- 예외: DB 모델을 직접 반환해야 하는 불가피한 레거시(ClickHouse 로그 등)는 예외를 두되, 가급적 DTO 변환을 권장합니다.
3. HTTP 메서드 (HTTP Methods)
리소스에 대한 행위는 HTTP 메서드로 표현합니다.
| 메서드 | 용도 | 멱등성(Idempotent) | 예시 |
|---|---|---|---|
| GET | 리소스 조회 | O | GET /clients (목록), GET /clients/:id (상세) |
| POST | 리소스 생성, 또는 복잡한 액션 | X | POST /clients (생성), POST /auth/login (액션) |
| PUT | 리소스 전체 수정 (대체) | O | PUT /users/:id |
| PATCH | 리소스 일부 수정 | O (권장) | PATCH /clients/:id/status |
| DELETE | 리소스 삭제 | O | DELETE /clients/:id |
4. 요청 및 응답 형식 (Request & Response)
4.1 목록 조회 (List Response)
목록 조회 시 반드시 페이지네이션 메타데이터를 포함해야 합니다.
{
"items": [
{ "id": "1", "name": "Resource A" },
{ "id": "2", "name": "Resource B" }
],
"limit": 50,
"offset": 0,
"total": 120 // 선택적 (성능 이슈 시 제외 가능)
}
4.2 단건 조회/생성/수정 (Single Resource Response)
데이터를 바로 반환하거나, 필요 시 래핑할 수 있습니다. 일관성을 위해 루트 객체로 반환하는 것을 권장합니다.
{
"id": "1",
"name": "Resource A",
"status": "active"
}
4.3 에러 응답 (Error Response)
모든 에러는 일관된 포맷을 유지해야 합니다. 프로덕션 환경에서는 내부 스택 트레이스를 노출하지 않아야 합니다.
HTTP Status Code 활용:
400 Bad Request: 입력값 검증 실패401 Unauthorized: 인증 토큰 없음/만료403 Forbidden: 권한 부족 (토큰은 있으나 접근 불가)404 Not Found: 리소스 없음409 Conflict: 데이터 충돌 (중복 생성 등)429 Too Many Requests: 레이트 리밋 초과500 Internal Server Error: 서버 내부 오류 (상세 내용 마스킹)503 Service Unavailable: 외부 의존성(Hydra, DB 등) 연결 실패
JSON Body:
{
"error": "사람이 읽을 수 있는 에러 메시지",
"code": "MACHINE_READABLE_CODE", // 선택적 (예: USER_NOT_FOUND, HYDRA_CONN_ERR)
"details": { ... } // 선택적 (Validation error 필드별 상세 등)
}
5. 헤더 및 보안 (Headers & Security)
5.1 인증 (Authentication)
- Authorization:
Bearer {token}형식을 사용합니다.- Backend는 Gateway 또는 Middleware에서 토큰을 검증하고
User Context를 생성해야 합니다.
- Backend는 Gateway 또는 Middleware에서 토큰을 검증하고
5.2 테넌트 격리 (Multi-tenancy)
- X-Tenant-ID: 관리자 API(
admin) 호출 시, 대상 테넌트를 식별하기 위해 필수적으로 사용합니다.- 슈퍼 어드민이 아닐 경우, 요청자의 권한과 헤더의 테넌트가 일치하는지 검증해야 합니다.
5.3 요청 추적 (Tracing)
- X-Request-ID: 모든 요청/응답에 고유 ID를 포함하여 로그 추적성을 확보합니다. 클라이언트가 보내지 않으면 서버가 생성합니다.
6. 개발 가이드라인 (Implementation Guidelines)
6.1 DTO 사용
- DB 모델(Gorm, ClickHouse struct)을 그대로 API 응답으로 내보내지 마십시오.
- 반드시 Response DTO 구조체를 별도로 정의하여
json태그를 통해 명명 규칙(camelCase)을 적용하고, 민감한 정보(비밀번호 해시, 내부 ID 등)를 필터링해야 합니다.
6.2 핸들러 구조
- 핸들러는
Service레이어를 호출하고, HTTP 요청/응답 처리(파싱, 상태 코드 매핑)에만 집중해야 합니다. - 비즈니스 로직은
Handler가 아닌Service또는Domain레이어에 위치해야 합니다.
6.3 로깅 정책
- 요청/응답 로그는 미들웨어 레벨에서 처리합니다.
- 에러 발생 시
slog.Error를 통해 스택 트레이스와 컨텍스트를 남기고, 클라이언트에게는 정제된 메시지만 전달합니다.