Laravel Sanctum으로 SPA 인증 마스터하기 🚀
안녕하세요, 개발자 여러분! 오늘은 정말 핫한 주제로 찾아왔어요. 바로 Laravel Sanctum을 활용한 SPA 인증에 대해 깊이 파헤쳐볼 거예요. 이 글을 다 읽고 나면 여러분도 Sanctum 마스터가 될 수 있을 거예요! 😎
요즘 웹 개발 트렌드를 보면 SPA(Single Page Application)가 대세잖아요? 근데 SPA에서 인증을 구현하는 게 좀 까다롭다는 거 다들 아시죠? 그래서 Laravel이 Sanctum이라는 초간단 인증 솔루션을 내놓은 거예요. 이거 진짜 대박이에요! 🎉
우리가 이 글에서 다룰 내용들을 미리 살짝 엿보자면요:
- Sanctum이 뭐길래 이렇게 핫한 건지
- SPA 인증의 비밀 레시피
- Sanctum 설치부터 사용까지 A to Z
- 실제 프로젝트에 적용하는 꿀팁들
- 보안 강화를 위한 추가 설정들
자, 이제 본격적으로 시작해볼까요? 여러분의 개발 실력이 한 단계 업그레이드되는 시간이 될 거예요! 🚀
1. Sanctum이 뭐길래 이렇게 핫한 거야? 🔥
여러분, Laravel Sanctum이 뭔지 아세요? 모르셔도 괜찮아요. 지금부터 상세하게 설명해드릴게요! 😊
Laravel Sanctum은 SPA(Single Page Application), 모바일 애플리케이션, 그리고 간단한 토큰 기반 API를 위한 가벼운 인증 시스템이에요. 쉽게 말해서, 우리가 만든 앱에서 사용자를 안전하게 인증하고 관리할 수 있게 해주는 도구라고 볼 수 있죠.
근데 왜 이렇게 인기가 많을까요? 🤔
Sanctum의 인기 비결:
- 초간단 설정: 복잡한 설정 없이 바로 사용 가능!
- 다재다능: SPA, 모바일 앱, API 등 다양한 환경 지원
- 보안성: CSRF 보호, 세션 인증 등 강력한 보안 기능 제공
- 성능: 가볍고 빠른 성능으로 앱의 반응성 향상
- Laravel과의 완벽한 통합: Laravel 생태계와 찰떡궁합!
ㅋㅋㅋ 이래서 개발자들이 Sanctum에 열광하는 거예요! 특히 SPA 개발할 때 인증 구현하느라 머리 아프셨던 분들께는 정말 단비 같은 존재일 거예요. 😌
그럼 Sanctum이 어떻게 동작하는지 좀 더 자세히 들여다볼까요?
Sanctum의 동작 원리
Sanctum은 크게 두 가지 방식으로 인증을 처리해요:
- SPA를 위한 쿠키 기반 세션 인증
- 모바일 애플리케이션과 API를 위한 토큰 기반 인증
오늘은 주로 SPA 인증에 초점을 맞춰볼 거예요. SPA에서 Sanctum은 Laravel의 기본 세션 인증을 사용해요. 근데 여기서 특별한 점이 있어요. 바로 CSRF 보호와 세션 쿠키를 동시에 처리한다는 거죠!
이게 무슨 말이냐고요? 쉽게 설명해드릴게요! 😄
SPA에서의 Sanctum 동작 과정:
- 사용자가 로그인 요청을 보내면
- Sanctum이 사용자 정보를 확인하고
- 세션을 생성해서 쿠키에 저장해요
- 이후 요청마다 이 쿠키를 통해 인증을 처리하죠
- CSRF 토큰도 자동으로 처리해주니까 보안도 챙기고!
이렇게 하면 프론트엔드와 백엔드가 분리되어 있어도 마치 하나의 앱처럼 자연스럽게 동작할 수 있어요. 진짜 편하지 않나요? 😎
그리고 Sanctum의 또 다른 장점! API 토큰 기능도 제공한다는 거예요. 이건 모바일 앱이나 외부 서비스와의 연동에 딱이에요. 토큰 하나로 안전하게 API를 호출할 수 있으니까요.
이 그림을 보면 Sanctum이 어떻게 SPA와 Laravel 백엔드 사이에서 인증을 처리하는지 한눈에 볼 수 있죠? 정말 깔끔하고 효율적이에요! 👍
자, 여기까지 Sanctum의 기본 개념과 동작 원리에 대해 알아봤어요. 이제 좀 감이 오시나요? ㅋㅋ
다음 섹션에서는 SPA 인증의 비밀 레시피에 대해 더 자세히 알아볼 거예요. Sanctum이 어떻게 SPA 인증의 여러 문제들을 해결하는지, 그 비결을 파헤쳐볼 거예요! 기대되지 않나요? 😄
그리고 잠깐! 여러분, 혹시 재능넷이라는 사이트 아세요? 개발자들의 재능을 공유하고 거래할 수 있는 플랫폼인데, 여기서도 Laravel Sanctum을 사용해서 인증 시스템을 구축했다고 해요. 실제 서비스에서 Sanctum이 어떻게 활용되는지 좋은 예시가 될 것 같아요. 나중에 한번 들어가 보는 것도 좋을 것 같아요! 😉
자, 이제 다음 섹션으로 넘어가볼까요? SPA 인증의 비밀 레시피, 정말 궁금하지 않나요? 🤫
2. SPA 인증의 비밀 레시피 🍳
여러분, SPA 개발할 때 인증 구현하느라 고생 많으셨죠? ㅋㅋㅋ 저도 처음에는 정말 머리 아팠어요. 근데 Sanctum을 알고 나서부터는 인생이 달라졌어요! 진짜에요! 😆
그럼 이제 Sanctum이 어떻게 SPA 인증의 문제들을 해결하는지, 그 비밀 레시피를 하나씩 파헤쳐볼까요?
1. CORS(Cross-Origin Resource Sharing) 문제 해결
SPA 개발할 때 가장 먼저 부딪히는 벽, 바로 CORS 문제죠. 프론트엔드와 백엔드가 다른 도메인에 있으면 브라우저가 보안상의 이유로 요청을 막아버리니까요. 😓
근데 Sanctum은 이 문제를 아주 우아하게 해결해요!
Sanctum의 CORS 해결책:
- config/cors.php 파일에서 CORS 설정을 쉽게 관리
- 프론트엔드 도메인을 허용 목록에 추가하면 끝!
- credentials 옵션을 true로 설정해 쿠키 전송 허용
이렇게 하면 프론트엔드와 백엔드가 서로 다른 도메인에 있어도 문제없이 통신할 수 있어요. 진짜 편하지 않나요? 😎
2. CSRF(Cross-Site Request Forgery) 공격 방어
CSRF 공격, 들어보셨죠? 해커가 사용자 몰래 악의적인 요청을 보내는 공격이에요. 이거 막으려면 보통 CSRF 토큰을 사용하는데, SPA에서는 이것도 좀 까다로워요.
근데 Sanctum은 이것도 완벽하게 해결해줘요!
Sanctum의 CSRF 방어 전략:
- Laravel의 기본 CSRF 보호 메커니즘 활용
- CSRF 토큰을 쿠키에 자동으로 설정
- 프론트엔드에서 별도의 처리 없이 자동으로 CSRF 토큰 전송
이렇게 하면 개발자가 따로 CSRF 토큰을 관리할 필요가 없어요. Sanctum이 알아서 다 해주니까요! 👏
3. 세션 관리의 편리함
SPA에서 세션 관리, 특히 여러 탭이나 창에서 로그인 상태를 유지하는 게 좀 골치 아프죠? Sanctum은 이 문제도 깔끔하게 해결해요!
Sanctum의 세션 관리 비결:
- Laravel의 기본 세션 메커니즘 사용
- HTTP-only 쿠키로 세션 정보 안전하게 저장
- 여러 탭/창에서 자동으로 로그인 상태 유지
이렇게 하면 사용자가 여러 탭을 열어도, 브라우저를 껐다 켜도 로그인 상태가 유지돼요. 사용자 경험 대박 좋아지겠죠? 😍
4. 토큰 기반 인증과의 조화
API 토큰 인증이 필요할 때도 있잖아요? 외부 서비스나 모바일 앱과 연동할 때 같은 경우요. Sanctum은 이것도 지원해요!
Sanctum의 토큰 인증 기능:
- 간단한 API 토큰 생성 및 관리
- 토큰에 능력(abilities) 부여 가능
- 세션 기반 인증과 토큰 기반 인증을 동시에 사용 가능
이렇게 하면 SPA뿐만 아니라 다양한 클라이언트에서 안전하게 API를 호출할 수 있어요. 진짜 만능이죠? 😎
5. 보안 강화
보안은 아무리 강조해도 지나치지 않죠. Sanctum은 보안에도 정말 신경을 많이 썼어요!
Sanctum의 보안 강화 전략:
- HTTP-only 쿠키로 XSS 공격 방어
- HTTPS 강제 적용 옵션
- Same-Site 쿠키 정책 지원
이런 보안 기능들 덕분에 개발자가 따로 신경 쓰지 않아도 기본적인 보안은 확보할 수 있어요. 안심되지 않나요? 😌
이 그림을 보면 Sanctum이 얼마나 다재다능한지 한눈에 볼 수 있죠? 정말 SPA 인증의 완벽한 레시피예요! 👨🍳👩🍳
자, 여기까지 Sanctum의 SPA 인증 비밀 레시피를 알아봤어요. 어때요? 생각보다 더 대단하지 않나요? ㅋㅋㅋ
Sanctum을 사용하면 이런 복잡한 문제들을 거의 자동으로 해결할 수 있어요. 개발자는 비즈니스 로직에만 집중할 수 있게 되는 거죠. 이게 바로 Sanctum의 매력이에요! 😍
그리고 재밌는 사실! 재능넷이라는 재능 공유 플랫폼에서도 Sanctum을 사용해서 인증 시스템을 구축했다고 해요. 실제 서비스에서 이렇게 활용되고 있다니, Sanctum의 실용성이 입증된 거 아닐까요? 👍
다음 섹션에서는 실제로 Sanctum을 설치하고 사용하는 방법에 대해 자세히 알아볼 거예요. 이론은 충분히 배웠으니, 이제 실전으로 가봐요! 여러분의 프로젝트에 Sanctum을 적용할 준비 되셨나요? 🚀
다음 섹션에서 만나요! 기대되지 않나요? 😄
3. Sanctum 설치부터 사용까지 A to Z 🛠️
자, 이제 실전으로 들어갈 시간이에요! Sanctum을 어떻게 설치하고 사용하는지 상세하게 알아볼 거예요. 준비되셨나요? let's go! 🚀
Step 1: Sanctum 설치하기
먼저 Sanctum을 설치해야겠죠? Laravel 프로젝트가 이미 있다고 가정하고 시작할게요.
Sanctum 설치 명령어:
composer require laravel/sanctum
이 명령어를 실행하면 Sanctum이 여러분의 프로젝트에 설치돼요. 엄청 간단하죠? ㅋㅋ
Step 2: Sanctum 설정하기
설치가 끝났으면 이제 설정을 해줘야 해요. 걱정 마세요, 이것도 엄청 쉬워요!
Sanctum 설정 단계:
- 설정 파일 발행:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
- 마이그레이션 실행:
php artisan migrate
이렇게 하면 Sanctum 설정 파일이 생성되고, 필요한 데이터베이스 테이블도 만들어져요. 완전 자동이죠? 😎
Step 3: Sanctum 미들웨어 추가하기
이제 Sanctum 미들웨어를 추가해야 해요. 이 미들웨어가 인증을 처리해줄 거예요.
app/Http/Kernel.php 파일 수정:
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
// ...
protected $middlewareGroups = [
// ...
'api' => [
EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
이렇게 하면 API 요청에 대해 Sanctum이 자동으로 인증을 처리해줘요. 편하죠? 👍
Step 4: CORS 설정하기
SPA를 위해서는 CORS 설정이 필수예요. 네, 계속해서 CORS 설정부터 이어가겠습니다.
SPA를 위해서는 CORS 설정이 필수예요. Sanctum이 CORS를 쉽게 처리할 수 있게 해주지만, 우리가 직접 몇 가지 설정을 해줘야 해요.
config/cors.php 파일 수정:
return [
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['http://localhost:3000'], // 여러분의 프론트엔드 URL로 변경하세요
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true, // 이 부분이 중요해요!
];
이렇게 설정하면 프론트엔드에서 백엔드로 안전하게 요청을 보낼 수 있어요. supports_credentials
를 true로 설정한 것, 기억하세요! 이게 쿠키 기반 인증의 핵심이에요. 😉
Step 5: 인증 라우트 설정하기
이제 로그인, 로그아웃 같은 인증 관련 라우트를 설정해볼게요.
routes/api.php 파일에 추가:
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\LogoutController;
Route::post('/login', [LoginController::class, 'login']);
Route::post('/logout', [LogoutController::class, 'logout'])->middleware('auth:sanctum');
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:sanctum');
이렇게 하면 기본적인 인증 라우트가 설정돼요. 로그인, 로그아웃, 그리고 현재 인증된 사용자 정보를 가져오는 라우트까지요. 👌
Step 6: 컨트롤러 구현하기
이제 실제로 인증을 처리할 컨트롤러를 만들어볼게요.
LoginController.php:
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
public function login(Request $request)
{
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return response()->json(['message' => 'Login successful'], 200);
}
return response()->json(['message' => 'The provided credentials do not match our records.'], 401);
}
}
LogoutController.php:
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LogoutController extends Controller
{
public function logout(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return response()->json(['message' => 'Logged out successfully'], 200);
}
}
이렇게 하면 로그인과 로그아웃 기능이 완성돼요. Sanctum이 세션을 관리해주기 때문에 우리는 기본적인 로직만 작성하면 돼요. 정말 편하죠? 😄
Step 7: 프론트엔드에서 사용하기
마지막으로, 프론트엔드에서 어떻게 Sanctum을 사용하는지 간단히 살펴볼게요. React를 예로 들어볼게요.
React에서 로그인 요청 보내기:
import axios from 'axios';
axios.defaults.withCredentials = true; // 이 부분이 중요해요!
const login = async (email, password) => {
try {
// CSRF 쿠키 가져오기
await axios.get('http://localhost:8000/sanctum/csrf-cookie');
// 로그인 요청
const response = await axios.post('http://localhost:8000/api/login', {
email,
password
});
console.log('Login successful', response.data);
} catch (error) {
console.error('Login failed', error.response.data);
}
};
여기서 주목할 점은 axios.defaults.withCredentials = true
부분이에요. 이렇게 설정해야 쿠키가 요청과 함께 전송돼요. 그리고 로그인 전에 CSRF 쿠키를 먼저 가져오는 것도 잊지 마세요!
자, 여기까지가 Sanctum을 설치하고 기본적으로 사용하는 방법이에요. 어때요? 생각보다 쉽죠? 😊
이렇게 설정만 잘 해두면, 이후에는 Sanctum이 알아서 인증을 처리해줘요. 개발자는 비즈니스 로직에만 집중할 수 있게 되는 거죠. 이게 바로 Sanctum의 매력이에요!
그리고 잊지 마세요. 실제 프로덕션 환경에서는 HTTPS를 꼭 사용해야 해요. 보안을 위해서 정말 중요해요!
자, 여기까지 Sanctum 설치부터 사용까지 A to Z를 알아봤어요. 이제 여러분도 Sanctum 마스터가 된 것 같은데요? ㅋㅋㅋ
다음 섹션에서는 실제 프로젝트에 Sanctum을 적용할 때 알아두면 좋은 꿀팁들을 소개해드릴게요. 기대되지 않나요? 😄
4. 실제 프로젝트에 적용하는 꿀팁들 🍯
자, 이제 Sanctum의 기본을 마스터하셨으니 실전에서 사용할 때 알아두면 좋은 꿀팁들을 알려드릴게요. 이 팁들을 활용하면 여러분의 프로젝트가 한층 더 견고해질 거예요! 😎
1. 토큰 수명 관리하기
Sanctum의 토큰은 기본적으로 영구적이에요. 하지만 보안을 위해 토큰의 수명을 제한하는 게 좋죠.
config/sanctum.php 파일에 추가:
'expiration' => 60 * 24, // 24시간 후 만료
이렇게 설정하면 토큰이 24시간 후에 자동으로 만료돼요. 보안과 사용자 경험 사이의 균형을 잡는 데 도움이 될 거예요. 👍
2. 다중 인증 가드 사용하기
여러 종류의 사용자(예: 일반 사용자, 관리자)를 다르게 인증하고 싶다면 다중 가드를 사용할 수 있어요.
config/auth.php 파일 수정:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
이렇게 설정하면 일반 사용자와 관리자를 별도로 인증할 수 있어요. 라우트에서는 이렇게 사용하면 돼요:
Route::middleware('auth:sanctum,admin')->get('/admin', function () {
// 관리자만 접근 가능
});
멋지죠? 이렇게 하면 보안을 한층 더 강화할 수 있어요. 😊
3. 사용자 지정 능력(Abilities) 활용하기
Sanctum을 사용하면 토큰에 특정 능력을 부여할 수 있어요. 이를 통해 세밀한 권한 제어가 가능해져요.
토큰 생성 시 능력 부여:
$token = $user->createToken('token-name', ['post:create', 'post:read'])->plainTextToken;
능력 확인:
if ($user->tokenCan('post:create')) {
// 포스트 생성 로직
}
이렇게 하면 같은 사용자라도 토큰에 따라 다른 권한을 가질 수 있어요. API를 더 유연하게 만들 수 있죠. 👨💻
4. 첫 요청 시 CSRF 토큰 자동 설정
SPA에서 매번 CSRF 토큰을 수동으로 가져오는 게 번거롭다면, 첫 요청 시 자동으로 설정하는 방법이 있어요.
프론트엔드 axios 설정:
import axios from 'axios';
axios.defaults.withCredentials = true;
axios.interceptors.response.use(
response => response,
async error => {
if (error.response.status === 419) {
await axios.get('/sanctum/csrf-cookie');
return axios(error.config);
}
return Promise.reject(error);
}
);
이렇게 하면 419 에러(CSRF 토큰 만료)가 발생했을 때 자동으로 새 토큰을 가져와서 재요청을 보내요. 사용자 경험이 훨씬 좋아질 거예요! 😃
5. 로그아웃 시 모든 디바이스에서 로그아웃
보안을 더욱 강화하고 싶다면, 로그아웃 시 해당 사용자의 모든 토큰을 삭제할 수 있어요.
LogoutController.php 수정:
public function logout(Request $request)
{
$user = $request->user();
$user->tokens()->delete(); // 모든 토큰 삭제
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return response()->json(['message' => 'Logged out from all devices'], 200);
}
이렇게 하면 한 디바이스에서 로그아웃할 때 모든 디바이스에서 동시에 로그아웃돼요. 보안에 민감한 애플리케이션에 특히 유용하죠. 🔒
자, 여기까지가 Sanctum을 실제 프로젝트에 적용할 때 알아두면 좋은 꿀팁들이에요. 어떠세요? 이 팁들을 활용하면 여러분의 애플리케이션이 한층 더 견고해질 거예요. 😊
그리고 잊지 마세요! 보안은 항상 진화하고 있어요. 최신 보안 동향을 계속 체크하고, 필요하다면 Sanctum 설정을 업데이트하는 것도 중요해요.
마지막으로, 재능넷 같은 실제 서비스에서 Sanctum을 어떻게 활용하고 있는지 살펴보는 것도 좋은 방법이에요. 실제 사례를 통해 배울 점이 많을 거예요. 👍
자, 이제 여러분은 Sanctum 전문가가 된 것 같은데요? ㅋㅋㅋ 다음 섹션에서는 Sanctum을 사용할 때 주의해야 할 점들에 대해 알아볼 거예요. 기대되지 않나요? 😄
5. 보안 강화를 위한 추가 설정들 🔒
여러분, 지금까지 Sanctum의 기본 사용법과 꿀팁들을 알아봤는데요. 이제 보안을 한층 더 강화할 수 있는 추가 설정들에 대해 알아볼 거예요. 보안은 아무리 강조해도 지나치지 않으니까요! 😉
1. HTTPS 강제 적용
프로덕션 환경에서는 반드시 HTTPS를 사용해야 해요. Sanctum에서는 이를 쉽게 설정할 수 있어요.
config/sanctum.php 파일에 추가:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
'%s%s',
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),
'middleware' => [
'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
],
'prefix' => 'api',
'guard' => 'web',
'expiration' => null,
'token_prefix' => '',
'except' => [],
'secure' => env('APP_ENV') !== 'local', // 이 부분이 중요해요!
이렇게 설정하면 로컬 환경을 제외한 모든 환경에서 HTTPS가 강제 적용돼요. 보안이 한층 강화되겠죠? 👍
2. 동시 로그인 제한
보안을 더욱 강화하고 싶다면, 한 계정에서 동시에 로그인할 수 있는 세션 수를 제한할 수 있어요.
새로운 미들웨어 생성 (app/Http/Middleware/LimitConcurrentSessions.php):
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class LimitConcurrentSessions
{
public function handle($request, Closure $next)
{
if (Auth::check()) {
$user = Auth::user();
$maxSessions = 3; // 최대 동시 세션 수
$sessions = DB::table('sessions')
->where('user_id', $user->id)
->orderBy('last_activity', 'desc')
->get();
if ($sessions->count() > $maxSessions) {
$oldestSession = $sessions->last();
DB::table('sessions')->where('id', $oldestSession->id)->delete();
}
}
return $next($request);
}
}
이 미들웨어를 커널에 등록하고 사용하면, 한 계정당 최대 3개의 동시 세션만 허용하게 돼요. 오래된 세션은 자동으로 로그아웃되죠. 보안과 사용자 경험 사이의 균형을 잡는 데 도움이 될 거예요. 😊
3. 비밀번호 정책 강화
Sanctum은 인증을 처리해주지만, 비밀번호 정책은 우리가 직접 설정해야 해요. Laravel의 기본 비밀번호 규칙을 강화해볼까요?
app/Rules/StrongPassword.php 파일 생성:
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class StrongPassword implements Rule
{
public function passes($attribute, $value)
{
return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/', $value);
}
public function message()
{
return 'The :attribute must be at least 8 characters long and contain at least one uppercase letter, one lowercase letter, one number, and one special character.';
}
}
이 규칙을 사용자 등록이나 비밀번호 변경 시 적용하면, 더욱 강력한 비밀번호를 사용하도록 유도할 수 있어요. 보안의 기본은 강력한 비밀번호니까요! 💪
4. 로그인 시도 제한
무차별 대입 공격을 방지하기 위해 로그인 시도 횟수를 제한하는 것도 좋아요. Laravel의 내장 기능을 사용해 쉽게 구현할 수 있죠.
LoginController.php 수정:
use Illuminate\Foundation\Auth\ThrottlesLogins;
class LoginController extends Controller
{
use ThrottlesLogins;
protected $maxAttempts = 5; // 최대 시도 횟수
protected $decayMinutes = 10; // 잠금 시간 (분)
// ... 기존 로그인 로직
protected function sendLockoutResponse(Request $request)
{
네, 계속해서 로그인 시도 제한에 대한 내용을 이어가겠습니다.
<pre><code> protected function sendLockoutResponse(Request $request)
{
$seconds = $this->limiter()->availableIn(
$this->throttleKey($request)
);
return response()->json([
'message' => 'Too many login attempts. Please try again in '.$seconds.' seconds.',
], 429);
}
}
이렇게 설정하면 5번의 로그인 실패 후 10분 동안 로그인이 차단돼요. 무차별 대입 공격으로부터 사용자 계정을 보호할 수 있죠. 👮♂️
5. 토큰 회전(Token Rotation) 구현
장기간 사용되는 토큰의 보안 위험을 줄이기 위해 토큰 회전을 구현할 수 있어요. 이는 일정 기간마다 새로운 토큰을 발급하는 방식이에요.
새로운 미들웨어 생성 (app/Http/Middleware/RotateToken.php):
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RotateToken
{
public function handle($request, Closure $next)
{
$response = $next($request);
if (Auth::check()) {
$user = Auth::user();
$tokenCreatedAt = $user->currentAccessToken()->created_at;
if ($tokenCreatedAt->addDays(7)->isPast()) {
$newToken = $user->createToken('api-token')->plainTextToken;
$user->tokens()->where('id', $user->currentAccessToken()->id)->delete();
$response->header('New-Token', $newToken);
}
}
return $response;
}
}
이 미들웨어를 사용하면 7일마다 새로운 토큰이 발급돼요. 클라이언트는 응답 헤더의 'New-Token' 값을 확인하고 새 토큰으로 교체해야 해요. 보안이 한층 강화되겠죠? 🔄
자, 여기까지가 Sanctum의 보안을 한층 더 강화할 수 있는 추가 설정들이에요. 어떠세요? 이 설정들을 적용하면 여러분의 애플리케이션이 훨씬 더 안전해질 거예요. 😊
물론 이게 전부는 아니에요. 보안은 끊임없이 발전하고 있으니, 항상 최신 보안 동향을 체크하고 필요한 업데이트를 해주는 것이 중요해요.
그리고 잊지 마세요! 이런 보안 설정들은 개발 단계에서부터 적용하는 것이 좋아요. 나중에 추가하려면 더 복잡해질 수 있거든요. 재능넷 같은 실제 서비스들도 이런 보안 설정들을 처음부터 고려했을 거예요.
자, 이제 여러분은 Sanctum 마스터를 넘어 보안 전문가가 된 것 같은데요? ㅋㅋㅋ 이 모든 지식을 여러분의 프로젝트에 적용해보세요. 훨씬 더 안전하고 견고한 애플리케이션을 만들 수 있을 거예요! 👨💻👩💻
여기까지 Laravel Sanctum을 활용한 SPA 인증에 대해 깊이 있게 알아봤어요. 이 글이 여러분의 개발 여정에 도움이 되었길 바라요. 항상 안전하고 즐거운 코딩하세요! 😄🚀