Auth 모듈
📝 초안 (Draft)
이 문서는 검토 중입니다. 내용이 변경될 수 있습니다.
Sanctum 기반 인증 서비스를 제공하는 Core 모듈입니다.
개요
Auth 모듈은 Laravel Sanctum을 래핑한 인증 서비스를 제공합니다. 세션 기반 웹 인증과 토큰 기반 API 인증을 모두 지원하며, Interface 기반 설계로 확장이 용이합니다.
┌─────────────────────────────────────────────────────────────┐
│ Auth 모듈 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Web 인증 │ │ API 인증 │ │ Token 관리 │ │
│ │ (Session) │ │ (Sanctum) │ │ │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └────────────────┼─────────────────┘ │
│ ↓ │
│ AuthService │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ↓ ↓ ↓ │
│ Permission Tenant Audit │
│ (레벨 확인) (컨텍스트) (로그 기록) │
└─────────────────────────────────────────────────────────────┘
핵심 컴포넌트
| 컴포넌트 | 역할 |
|---|---|
AuthService | 인증 로직 통합 서비스 |
AuthServiceInterface | 테스트 용이성을 위한 인터페이스 |
UserAuthenticated | 로그인 성공 이벤트 |
UserLoggedOut | 로그아웃 이벤트 |
TokenCreated | API 토큰 생성 이벤트 |
AuthService 사용법
의존성 주입
<?php
namespace App\Http\Controllers;
use App\Core\Base\Auth\Contracts\AuthServiceInterface;
class AuthController extends Controller
{
public function __construct(
private AuthServiceInterface $authService
) {}
public function showLoginForm()
{
if ($this->authService->check()) {
return redirect('/dashboard');
}
return view('auth.login');
}
}
기본 인증
// 로그인 시도
$user = $this->authService->login([
'email' => $request->email,
'password' => $request->password,
], $request->boolean('remember'));
if ($user) {
return redirect('/dashboard');
}
return back()->withErrors(['email' => '인증에 실패했습니다.']);
로그아웃
public function logout()
{
$this->authService->logout();
return redirect('/');
}
웹 인증 (Session 기반)
로그인 컨트롤러 예시
<?php
namespace App\Http\Controllers\Auth;
use App\Core\Base\Auth\Contracts\AuthServiceInterface;
use App\Http\Requests\LoginRequest;
use Illuminate\Http\Request;
class LoginController extends Controller
{
public function __construct(
private AuthServiceInterface $authService
) {}
public function login(LoginRequest $request)
{
$user = $this->authService->login(
$request->only('email', 'password'),
$request->boolean('remember')
);
if (!$user) {
return back()
->withInput($request->only('email'))
->withErrors(['email' => '이메일 또는 비밀번호가 올바르지 않습니다.']);
}
// 인증 가능 여부 확인 (이메일 인증, 계정 활성화 등)
if (!$this->authService->canAuthenticate($user)) {
$this->authService->logout();
return back()->withErrors(['email' => '이 계정으로 로그인할 수 없습니다.']);
}
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
public function logout(Request $request)
{
$this->authService->logout();
return redirect('/');
}
}
Remember Me
// Remember 옵션 활성화
$user = $this->authService->login($credentials, remember: true);
// Remember 쿠키 설정 커스터마이징 (config/auth.php)
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
],
API 인증 (Token 기반)
토큰 발급
<?php
namespace App\Http\Controllers\Api;
use App\Core\Base\Auth\Contracts\AuthServiceInterface;
use App\Http\Requests\Api\LoginRequest;
class AuthController extends Controller
{
public function __construct(
private AuthServiceInterface $authService
) {}
public function login(LoginRequest $request)
{
$user = $this->authService->attempt($request->only('email', 'password'));
if (!$user) {
return response()->json([
'message' => '인증에 실패했습니다.',
], 401);
}
// 토큰 생성
$token = $this->authService->createToken(
user: $user,
name: $request->device_name ?? 'api-token',
abilities: ['*'] // 모든 권한
);
return response()->json([
'user' => $user,
'token' => $token,
'token_type' => 'Bearer',
]);
}
public function logout()
{
$user = $this->authService->user();
if ($user) {
// 현재 토큰만 폐기
$token = $this->authService->currentAccessToken();
if ($token && method_exists($token, 'delete')) {
$token->delete();
}
}
return response()->json(['message' => '로그아웃되었습니다.']);
}
public function user()
{
return response()->json($this->authService->user());
}
}