128호. 라라벨 7 새기능 - 생텀(Sanctum) free

2020-04-20

1일 1식 라라벨을 초기부터 구독해오신 분이라면 테일러 오트웰은 API라고 할지라도 내부 애플리케이션에서 호출하는 것이면 api.php 가 아닌 web.php 에 라우트를 작성한다는 글을 읽어보셨을 겁니다. (참고 테일러 오트웰은 왜 API 라우트를 routes/web.php에 작성했을까?)


하지만 여전히 많은 사람들은 이러한 내용을 모르고 계속 혼란스러워 하고 있었을겁니다. 게다가 리액트, Vue 등 프론트엔드 프레임워크가 급부상함에 따라 프론트엔드가 아예 독자적인 레파지토리를 갖는 싱글 페이지 애플리케이션(이하 SPA)으로 제작되고, 라라벨은 백엔드 API로만 사용되는 경우가 많아졌습니다. SPA는 백엔드 라라벨과 세션을 공유할 방법이 없기 때문에 앞서 언급한 것 처럼 web 라우트를 이용하기도 어렵습니다.


기존 API 토큰 인증은 너무 단순한 기능만 제공했고, 패스포트(OAuth 2.0)를 쓰자니 너무 무거웠습니다. 그래서 생텀은 토큰 인증에 약간의 기능을 더하되 패스포트 보다는 훨씬 가벼운 형태로 만들어졌습니다.


즉, 생텀은 SPA의 인증을 쉽게 처리하고, OAuth보다 가벼운 토큰 인증 시스템을 제공한다는 두 가지 목적으로 탄생했습니다.


제가 생각하는 생텀의 가장 큰 특징은 하나의 미들웨어로 세션 인증과 토큰 인증을 모두 처리한다는 것입니다.


Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});

위와 같이 API 라우트에 sanctum 인증 가드를 연결하면, SPA에서 온 요청은 세션 인증으로 처리하고 그렇지 않으면 API 토큰 인증으로 처리합니다.


토큰 발행


토큰은 User 모델에 HasApiTokens 트레이트를 추가해서 createToken() 메서드로 발행합니다. 발행한 토큰을 사용자에게 보여줄 때는 생성된 토큰 인스턴스의 plainTextToken 속성을 사용해서 보여줍니다.


return $user->createToken(‘token-name’)->plainTextToken;

발급 받은 토큰을 이후에 보낼 요청의 Authorization 헤더에 Bearer 토큰으로 첨부해서 자격을 증명할 수 있습니다.


토큰 기능


토큰을 발행할 때 기능을 설정해서 OAuth의 스코프와 비슷하게 권한을 제어할 수 있습니다.


return $user->createToken('token-name', ['server:update'])->plainTextToken;

HasApiTokens 트레이트의 tokenCan() 메서드로 해당 기능에 대한 권한이 있는지 검사할 수 있습니다.


if ($user->tokenCan('server:update')) {
//
}

SPA 인증


SPA 인증을 위해서는 라라벨 애플리케이션에 일련의 설정을 해두고(자세한 내용은 공식 메뉴얼을 참고) /sanctum/csrf-cookie 라우트를 요청한 후


axios.get('/sanctum/csrf-cookie').then(response => {
// Login...
});

라라벨 애플리케이션의 로그인용 라우트에(laravel/ui 인증 스캐폴딩을 이용했다면 /login) POST 요청을 보내 로그인하면 됩니다. 이렇게 한 번 로그인을 하고나면 별도로 토큰 등을 이용할 필요 없이 세션으로 로그인이 유지됩니다. 또한 라라벨 인증 시스템이 제공하는 기본적인 보안(CSRF, XSS 등) 기능도 함께 이용하게 됩니다.


마치며


라라벨 7이 출시된 지 이미 몇 주가 지나긴 했지만 늦게나마 생텀에 대해 정리해봤습니다. 구체적인 사용방법은 공식 메뉴얼에 잘 정리가 되어 있어서 특징 위주로 정리했습니다. 실제로 사용하실 때는 메뉴얼을 참고하시기 바랍니다.


1일 1식 라라벨 128호

2020년 4월 20일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.