티스토리 뷰
Laravel 5 크로스 도메인 ( CrossDomain ) POST 처리시 TokenMismatchException 해결하기
Deok.ME 2015. 3. 22. 01:32Laravel 5 에서 크로스 도메인 처리시 알아 두셔야할 부분이 header('Access-Control-Allow-Origin: *'); 뿐만 아니라 csrf 보호 기능도 수정해주셔야 합니다.
header('Access-Control-Allow-Origin: *'); 은 기본적인 기능이니 알고 계시리라 믿고... 넘어 가시거나 링크 ( jQuery Cross domain - 크로스 도메인 문제 해결하기 ) 를 참고 하시기 바랍니다.
csrf 란? Cross-site request forgery 사이트간 요청 위조 를 참고하시기 바랍니다.
Laravel 5 의 경우 CSRF Protection 을 통해서 특정 토큰을 같이 전송하지 않으면 토큰미스 에러 기본적으로 발생합니다. ( 간단한 CSRF 방지 방법 )
한 가지 문제가 있다면 REStful API 와 같이 내부에서 요청을 보내는곳이 아닌 도메인이나 프로그램에서 post 를 보낼 경우 처리가 쉽지 않다는게 문제입니다.
설명하기에 앞서 Laravel 의 버전에 따라 다르고 어떻게 해결하느냐에 따라 ( 취향... ) 다르니 구글링으로 다른 더 좋은 방법을 찾으시는 것도 좋은 선택일수 있습니다.
1. Kernel 에서 VerifyCsrfToken 끄기
Laravel 5 기준으로 우선 /app/http/kernel.php 를 열어 주도록 합니다.
열어 주시면 아래와 같은 코드를 보실 수 있습니다. 여기서 'App\Http\Middleware\VerifyCsrfToken', 부분을 아래와 같이 주석 처리 해주시기 바랍니다. 그리고 등록되어있는 'App\Http\Middleware\VerifyCsrfToken' 을 하단에 vcsrft ( 원하는 이름으로...) 와 함께 추가해 주시기 바랍니다.
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { /** * The application's global HTTP middleware stack. * * @var array */ protected $middleware = [ 'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 'Illuminate\Cookie\Middleware\EncryptCookies', 'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 'Illuminate\Session\Middleware\StartSession', 'Illuminate\View\Middleware\ShareErrorsFromSession', //'App\Http\Middleware\VerifyCsrfToken', ]; /** * The application's route middleware. * * @var array */ protected $routeMiddleware = [ 'auth' => 'App\Http\Middleware\Authenticate', 'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth', 'guest' => 'App\Http\Middleware\RedirectIfAuthenticated', 'vcsrft' => 'App\Http\Middleware\VerifyCsrfToken', ]; }
위의 예제로 완전히 VerifyCsrfToken 를 끄게 되었습니다.
만약 VerifyCsrfToken 를 Router 에 따라 활성화 하고 싶으시다면 아래와 같이 Router 에 주소를 추가 할때 위에서 등록한 vcsrft 를 추가하여 사용 하는 것이 가능합니다.
위의 와 같이 kernel 을 변경 후 아래와 같은 방법으로 특정 주소 에서 활성화 하는 것이 가능합니다.
Route::post('/utils/checkEmail_vcsrft', ['middleware' => 'vcsrft' , function(){ return "test"; }]);
2. VerifyCsrfToken 에서 REQUEST_URL 로 걸러내 주기
아래는 URL 을 VerifyCsrfToken 처리과정에 미리 입력하여 걸러내는 코드 입니다.
주의 $_SERVER['REQUEST_URL'] 을 사용하기 때문에 앞에 '/' 을 붙여 주셔야 합니다.
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; class VerifyCsrfToken extends BaseVerifier { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $non_vct = array( '/utils/checkEmail_non_vct', '/utils/checkNick_non_vct' ); $state = in_array($_SERVER['REQUEST_URI'],$non_vct); if($state){ return $next($request); }else{ return parent::handle($request, $next); } } }
일단 여러가지 방법이 있겠지만 급한대로 몇가지 찾은 방법중 2개 정도를 작성해봤습니다. 즐거운 개발 되시기 바랍니다.
'Frameworks > Laravel' 카테고리의 다른 글
Laravel 5 새로운 어플리케이션 키 생성하기 (0) | 2015.11.08 |
---|---|
Laravel 5 라우트 ( Route ) HTTPS 보안 방식으로만 라우트 ( Route ) 하기 (0) | 2015.11.05 |
Laravel 5 에서 자동으로 사용자 Locale 지정하기 (0) | 2015.11.04 |
Ubuntu 에 PHP framework Laravel 설치하기 (0) | 2015.03.08 |
Ubuntu 에 Laravel 설치하기 (0) | 2015.03.02 |
- Total
- Today
- Yesterday
- 서버
- 웹 개발자
- Database
- 설치
- 인터넷
- SNS
- 서버 개발
- Tutorialbook
- 웹
- 개발
- 웹 개발
- 웹 서버
- JavaScript
- Nodejs
- 게임 개발
- 튜토리얼북
- php
- 개발자
- 맥
- 에러
- 게임
- ubuntu
- Developer
- mac
- 우분투
- html
- 데이터베이스
- cocos2d-x
- it
- Laravel
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |