인증 API
사용자 인증 및 토큰 관리를 위한 API 레퍼런스입니다.
개요
Multi-SaaS Kit은 Laravel Sanctum 기반의 토큰 인증을 사용합니다.
| 항목 | 설명 |
|---|---|
| 인증 방식 | Bearer Token (Sanctum) |
| 토큰 형식 | {token_id}|{random_string} |
| 헤더 | Authorization: Bearer \{token\} |
| 만료 | 설정 가능 (기본: 무제한) |
엔드포인트
POST /api/v1/auth/login
사용자 로그인 및 액세스 토큰 발급
Request
POST /api/v1/auth/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "password123",
"device_name": "web-browser"
}
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
email | string | ✅ | 이메일 주소 |
password | string | ✅ | 비밀번호 |
device_name | string | ✅ | 디바이스 식별자 |
Response
성공 (200 OK)
{
"success": true,
"data": {
"token": "1|abc123def456...",
"token_type": "Bearer",
"user": {
"id": 1,
"name": "홍길동",
"email": "user@example.com",
"permission_level": 6,
"tenant_id": 1
}
}
}
실패 (401 Unauthorized)
{
"success": false,
"message": "The provided credentials are incorrect.",
"errors": {
"email": ["인증 정보가 올바르지 않습니다."]
}
}
POST /api/v1/auth/logout
현재 토큰 무효화 (로그아웃)
Request
POST /api/v1/auth/logout
Authorization: Bearer YOUR_TOKEN
Response
성공 (200 OK)
{
"success": true,
"message": "로그아웃되었습니다."
}
POST /api/v1/auth/logout-all
모든 디바이스에서 로그아웃 (모든 토큰 무효화)
Request
POST /api/v1/auth/logout-all
Authorization: Bearer YOUR_TOKEN
Response
성공 (200 OK)
{
"success": true,
"message": "모든 세션에서 로그아웃되었습니다.",
"data": {
"revoked_tokens": 3
}
}
GET /api/v1/auth/me
현재 인증된 사용자 정보 조회
Request
GET /api/v1/auth/me
Authorization: Bearer YOUR_TOKEN
Response
성공 (200 OK)
{
"success": true,
"data": {
"id": 1,
"name": "홍길동",
"email": "user@example.com",
"email_verified_at": "2024-01-01T00:00:00Z",
"permission_level": 6,
"permission_level_name": "Member",
"tenant": {
"id": 1,
"name": "Example Tenant",
"slug": "example"
},
"organization": {
"id": 1,
"name": "Example Org"
},
"workspace": {
"id": 1,
"name": "Default Workspace"
},
"created_at": "2024-01-01T00:00:00Z"
}
}
POST /api/v1/auth/refresh
토큰 갱신 (새 토큰 발급)
참고
Sanctum은 기본적으로 토큰 갱신을 지원하지 않습니다. 이 엔드포인트는 기존 토큰을 폐기하고 새 토큰을 발급합니다.
Request
POST /api/v1/auth/refresh
Authorization: Bearer YOUR_TOKEN
Response
성공 (200 OK)
{
"success": true,
"data": {
"token": "2|xyz789abc...",
"token_type": "Bearer"
}
}
토큰 관리
토큰 생성 시 능력(Abilities) 설정
토큰에 특정 권한만 부여할 수 있습니다.
// 모든 권한
$token = $user->createToken('api-token');
// 읽기 전용
$token = $user->createToken('read-only', ['read']);
// 특정 리소스만
$token = $user->createToken('tenant-manager', ['tenant:read', 'tenant:write']);
토큰 만료 설정
// config/sanctum.php
'expiration' => 60 * 24, // 24시간 (분 단위)
// 또는 토큰 생성 시 개별 설정
$token = $user->createToken('temp-token');
$token->accessToken->expires_at = now()->addHours(1);
$token->accessToken->save();
오류 코드
| HTTP 코드 | 코드 | 설명 |
|---|---|---|
| 401 | unauthenticated | 인증되지 않음 (토큰 없음/만료) |
| 401 | invalid_credentials | 잘못된 로그인 정보 |
| 403 | forbidden | 권한 없음 |
| 422 | validation_error | 입력값 검증 실패 |
| 429 | too_many_requests | Rate Limit 초과 |
Rate Limiting
인증 관련 API는 브루트포스 공격 방지를 위해 Rate Limit이 적용됩니다.
| 엔드포인트 | 제한 |
|---|---|
/auth/login | 5회/분 (IP 기준) |
/auth/logout | 60회/분 |
/auth/me | 60회/분 |
Rate Limit 초과 시 응답:
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"success": false,
"message": "Too many login attempts. Please try again in 60 seconds."
}
사용 예제
cURL
# 로그인
curl -X POST https://api.example.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com","password":"password123","device_name":"curl"}'
# 사용자 정보 조회
curl -X GET https://api.example.com/api/v1/auth/me \
-H "Authorization: Bearer 1|abc123..."
# 로그아웃
curl -X POST https://api.example.com/api/v1/auth/logout \
-H "Authorization: Bearer 1|abc123..."
JavaScript (Fetch)
// 로그인
const loginResponse = await fetch('/api/v1/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: 'user@example.com',
password: 'password123',
device_name: 'web-app',
}),
});
const { data } = await loginResponse.json();
const token = data.token;
// 인증된 요청
const userResponse = await fetch('/api/v1/auth/me', {
headers: {
'Authorization': `Bearer ${token}`,
},
});
PHP (Laravel HTTP Client)
use Illuminate\Support\Facades\Http;
// 로그인
$response = Http::post('https://api.example.com/api/v1/auth/login', [
'email' => 'user@example.com',
'password' => 'password123',
'device_name' => 'laravel-app',
]);
$token = $response->json('data.token');
// 인증된 요청
$user = Http::withToken($token)
->get('https://api.example.com/api/v1/auth/me')
->json('data');
2FA 인증 (선택)
Two-Factor Authentication 플러그인이 활성화된 경우:
2FA가 필요한 로그인
// 로그인 응답
{
"success": false,
"requires_2fa": true,
"message": "2단계 인증이 필요합니다.",
"data": {
"two_factor_token": "temp_2fa_abc123..."
}
}
2FA 코드 제출
POST /api/v1/auth/two-factor
Content-Type: application/json
{
"two_factor_token": "temp_2fa_abc123...",
"code": "123456"
}