티스토리 뷰

 Laravel 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개 정도를 작성해봤습니다. 즐거운 개발 되시기 바랍니다.




공유하기 링크
댓글