Skip to main content

사용자 API

사용자 관리를 위한 API 레퍼런스입니다.

개요

사용자 API는 권한 레벨에 따라 접근 범위가 제한됩니다.

권한 레벨접근 범위가능한 작업
Platform Admin (0)모든 사용자전체 CRUD
SaaS Admin (1)SaaS 내 사용자전체 CRUD
Tenant Admin (2)Tenant 내 사용자전체 CRUD
Organization Admin (3)Organization 내 사용자조회, 수정
Workspace Admin (4)Workspace 내 사용자조회
Team Leader (5)팀 멤버조회
Member (6)본인만본인 조회/수정

엔드포인트

GET /api/v1/users

사용자 목록 조회

Request

GET /api/v1/users?page=1&per_page=15&search=홍길동
Authorization: Bearer YOUR_TOKEN

Query Parameters

파라미터타입기본값설명
pageinteger1페이지 번호
per_pageinteger15페이지당 항목 수 (max: 100)
searchstring-이름/이메일 검색
permission_levelinteger-권한 레벨 필터
tenant_idinteger-테넌트 ID 필터
organization_idinteger-조직 ID 필터
workspace_idinteger-워크스페이스 ID 필터
sortstringcreated_at정렬 필드
orderstringdesc정렬 방향 (asc/desc)

Response

성공 (200 OK)

{
"success": true,
"data": [
{
"id": 1,
"name": "홍길동",
"email": "hong@example.com",
"permission_level": 6,
"permission_level_name": "Member",
"tenant_id": 1,
"organization_id": 1,
"workspace_id": 1,
"email_verified_at": "2024-01-01T00:00:00Z",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
],
"meta": {
"current_page": 1,
"from": 1,
"last_page": 10,
"per_page": 15,
"to": 15,
"total": 150
},
"links": {
"first": "/api/v1/users?page=1",
"last": "/api/v1/users?page=10",
"prev": null,
"next": "/api/v1/users?page=2"
}
}

GET /api/v1/users/:id

특정 사용자 상세 조회

Request

GET /api/v1/users/1
Authorization: Bearer YOUR_TOKEN

Response

성공 (200 OK)

{
"success": true,
"data": {
"id": 1,
"name": "홍길동",
"email": "hong@example.com",
"permission_level": 6,
"permission_level_name": "Member",
"tenant": {
"id": 1,
"name": "Example Tenant"
},
"organization": {
"id": 1,
"name": "Example Org"
},
"workspace": {
"id": 1,
"name": "Default Workspace"
},
"team": {
"id": 1,
"name": "Development"
},
"email_verified_at": "2024-01-01T00:00:00Z",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
}

실패 (404 Not Found)

{
"success": false,
"message": "사용자를 찾을 수 없습니다."
}

POST /api/v1/users

새 사용자 생성

Request

POST /api/v1/users
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"name": "김철수",
"email": "kim@example.com",
"password": "SecureP@ss123!",
"password_confirmation": "SecureP@ss123!",
"permission_level": 6,
"tenant_id": 1,
"organization_id": 1,
"workspace_id": 1,
"team_id": 1,
"send_welcome_email": true
}

Request Body

필드타입필수설명
namestring이름 (2-100자)
emailstring이메일 (고유)
passwordstring비밀번호 (8자 이상, 특수문자 포함)
password_confirmationstring비밀번호 확인
permission_levelinteger권한 레벨 (0-6)
tenant_idinteger-테넌트 ID (Level 1 이상 필수)
organization_idinteger-조직 ID (Level 3 이상 필수)
workspace_idinteger-워크스페이스 ID (Level 4 이상 필수)
team_idinteger-팀 ID (Level 5-6 필수)
send_welcome_emailboolean-환영 이메일 발송 (기본: true)
권한 제한

생성자의 권한 레벨보다 높은(숫자가 작은) 레벨의 사용자는 생성할 수 없습니다.

Response

성공 (201 Created)

{
"success": true,
"message": "사용자가 생성되었습니다.",
"data": {
"id": 2,
"name": "김철수",
"email": "kim@example.com",
"permission_level": 6,
"created_at": "2024-01-15T00:00:00Z"
}
}

실패 (422 Unprocessable Entity)

{
"success": false,
"message": "입력값을 확인해주세요.",
"errors": {
"email": ["이미 사용 중인 이메일입니다."],
"password": ["비밀번호는 최소 8자 이상이어야 합니다."]
}
}

PUT /api/v1/users/:id

사용자 정보 수정

Request

PUT /api/v1/users/1
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"name": "홍길동 (수정)",
"email": "hong.new@example.com",
"permission_level": 5,
"workspace_id": 2
}

Request Body

필드타입설명
namestring이름
emailstring이메일
passwordstring새 비밀번호 (변경 시)
password_confirmationstring비밀번호 확인
permission_levelinteger권한 레벨
tenant_idinteger테넌트 ID
organization_idinteger조직 ID
workspace_idinteger워크스페이스 ID
team_idinteger팀 ID

Response

성공 (200 OK)

{
"success": true,
"message": "사용자 정보가 수정되었습니다.",
"data": {
"id": 1,
"name": "홍길동 (수정)",
"email": "hong.new@example.com",
"updated_at": "2024-01-15T12:00:00Z"
}
}

DELETE /api/v1/users/:id

사용자 삭제 (Soft Delete)

Request

DELETE /api/v1/users/1
Authorization: Bearer YOUR_TOKEN

Response

성공 (200 OK)

{
"success": true,
"message": "사용자가 삭제되었습니다."
}

실패 (403 Forbidden)

{
"success": false,
"message": "본인 계정은 삭제할 수 없습니다."
}

POST /api/v1/users/:id/restore

삭제된 사용자 복원

Request

POST /api/v1/users/1/restore
Authorization: Bearer YOUR_TOKEN

Response

성공 (200 OK)

{
"success": true,
"message": "사용자가 복원되었습니다.",
"data": {
"id": 1,
"name": "홍길동",
"email": "hong@example.com"
}
}

프로필 관리

GET /api/v1/users/me/profile

본인 프로필 상세 조회

GET /api/v1/users/me/profile
Authorization: Bearer YOUR_TOKEN

PUT /api/v1/users/me/profile

본인 프로필 수정

PUT /api/v1/users/me/profile
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"name": "새 이름",
"avatar": "base64_encoded_image...",
"timezone": "Asia/Seoul",
"locale": "ko"
}

PUT /api/v1/users/me/password

본인 비밀번호 변경

PUT /api/v1/users/me/password
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"current_password": "OldP@ss123!",
"password": "NewP@ss456!",
"password_confirmation": "NewP@ss456!"
}

필터링 예제

특정 테넌트의 관리자만 조회

GET /api/v1/users?tenant_id=1&permission_level=2

이메일로 검색

GET /api/v1/users?search=@example.com

최근 가입순 정렬

GET /api/v1/users?sort=created_at&order=desc

복합 필터

GET /api/v1/users?tenant_id=1&organization_id=5&permission_level=6&search=김&per_page=50

오류 코드

HTTP 코드코드설명
400invalid_request잘못된 요청
401unauthenticated인증 필요
403forbidden권한 부족
404not_found사용자 없음
409conflict이메일 중복
422validation_error입력값 오류

사용 예제

cURL

# 사용자 목록 조회
curl -X GET "https://api.example.com/api/v1/users?page=1&per_page=10" \
-H "Authorization: Bearer YOUR_TOKEN"

# 사용자 생성
curl -X POST "https://api.example.com/api/v1/users" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "김철수",
"email": "kim@example.com",
"password": "SecureP@ss123!",
"password_confirmation": "SecureP@ss123!",
"permission_level": 6,
"tenant_id": 1
}'

# 사용자 수정
curl -X PUT "https://api.example.com/api/v1/users/1" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "홍길동 (수정)"}'

# 사용자 삭제
curl -X DELETE "https://api.example.com/api/v1/users/1" \
-H "Authorization: Bearer YOUR_TOKEN"

JavaScript

// 사용자 목록 조회 with 필터
const fetchUsers = async (filters = {}) => {
const params = new URLSearchParams({
page: 1,
per_page: 15,
...filters,
});

const response = await fetch(`/api/v1/users?${params}`, {
headers: {
'Authorization': `Bearer ${token}`,
},
});

return response.json();
};

// 사용
const users = await fetchUsers({
tenant_id: 1,
search: '홍길동',
});

관련 문서