Sanctum이란
Laravel Sanctum은 SPA(싱글 페이지 애플리케이션)·모바일 앱·심플한 API를 위한 경량 인증 패키지입니다. 복잡한 OAuth 지식이 없어도, 사용자별로 여러 API 토큰을 발행·관리할 수 있습니다. Sanctum이 해결하는 문제는 2가지입니다.자사 SPA로부터 API를 호출하는 경우는 SPA 인증을 사용합니다. 모바일 앱이나 서드파티가 API를 이용하는 경우는 API 토큰 인증을 사용합니다. 어느 한쪽만을 사용하는 것도 상관없습니다.
Passport와의 구분 사용
외부 서비스에 대해 OAuth2 프로바이더가 될 필요가 있는 경우는 Passport를 선택하지만, 많은 애플리케이션에서는 Sanctum으로 충분합니다.
설치와 설정
설치
install:api Artisan 명령을 실행하기만 하면 Sanctum이 셋업됩니다.
laravel/sanctum패키지의 설치personal_access_tokens테이블의 마이그레이션 파일의 공개- 마이그레이션의 실행
HasApiTokens 트레이트를 추가
User 모델에 HasApiTokens 트레이트를 추가합니다.
$user->createToken()이나 $user->tokens 등의 메서드를 사용할 수 있게 됩니다.
API 토큰 인증
토큰 플로우
토큰을 발행
createToken() 메서드로 토큰을 발행합니다. plainTextToken 프로퍼티에서 평문의 토큰 값을 취득할 수 있습니다. 평문 토큰은 데이터베이스에 보존되지 않기 때문에, 발행 직후에 사용자에게 반환할 필요가 있습니다.
스코프(어빌리티)를 설정
토큰에 대해 어빌리티(스코프)를 부여함으로써, 그 토큰으로 실행할 수 있는 조작을 제한할 수 있습니다.미들웨어에서 스코프를 확인
bootstrap/app.php에 미들웨어 에일리어스를 등록합니다.
토큰의 유효 기한
기본적으로 Sanctum 토큰에 유효 기한은 없습니다.config/sanctum.php의 expiration 옵션에서 분 단위의 유효 기한을 설정할 수 있습니다.
토큰을 실효시키기
SPA 인증
SPA 인증은 세션 쿠키를 사용하기 때문에, 토큰을 발행·관리할 필요가 없습니다. 자사 프론트엔드(Vue, React, Next.js 등)로부터 API를 호출하는 경우에 적합합니다.Sanctum 미들웨어를 활성화
bootstrap/app.php에서 statefulApi() 미들웨어를 활성화합니다.
1st-party 도메인을 설정
config/sanctum.php의 stateful 옵션에 SPA의 도메인을 설정합니다.
CORS 설정
다른 서브도메인에서 API를 호출하는 경우는, CORS 설정이 필요합니다.config/cors.php에서 supports_credentials를 true로 설정합니다.
SPA로부터의 인증 플로우
1
CSRF 쿠키를 취득
로그인 전에
/sanctum/csrf-cookie 엔드포인트를 호출해 CSRF 보호를 초기화합니다.2
로그인 리퀘스트를 송신
/login 엔드포인트에 POST 리퀘스트를 보냅니다.3
인증 완료 리퀘스트를 보냄
로그인 후의 리퀘스트는 세션 쿠키로 자동적으로 인증됩니다.
인증 완료 라우트의 보호
auth:sanctum 미들웨어를 라우트에 적용하면, 미인증의 리퀘스트에 대해 401 Unauthorized가 반환됩니다. API 토큰 인증·SPA 인증의 양쪽을 이 미들웨어 하나로 처리할 수 있습니다.
실용 예: 로그인 API와 토큰 반환
모바일 앱을 위한 API 토큰 인증을 구현하는 예입니다.1
로그인 엔드포인트를 작성
2
인증 완료 라우트를 작성
3
클라이언트로부터 리퀘스트를 보냄
테스트
Sanctum의 테스트에서는Sanctum::actingAs()를 사용해 사용자를 인증하고, 부여할 어빌리티를 지정합니다.
- Pest
- PHPUnit
정리
설치 순서의 확인
설치 순서의 확인
HasApiTokens 트레이트를 추가:자주 사용하는 API 정리
자주 사용하는 API 정리
API 토큰 인증 vs SPA 인증의 선택
API 토큰 인증 vs SPA 인증의 선택
- API 토큰 인증: 모바일 앱, 서드파티, CLI 도구 등, 세션을 가지지 않는 클라이언트로부터 이용하는 경우.
- SPA 인증: 자사의 Vue/React/Next.js 프론트엔드 등, 같은 도메인(또는 서브도메인) 위의 SPA로부터 이용하는 경우. 보다 시큐어하고 토큰 관리가 불필요.