'WEB2.0/프로그래밍'에 해당되는 글 160건

laravel 세션 만료로 인한 csrf 오류 예외처리 하기

laravel 문서에는 별다른 언급이 없어서 모르고 지나갔던 사실인데 운좋게도(?) 발견한 내용입니다.


참고하셔서 적용하시면 좋을것 같습니다.



구체적으로 설명드리자면


laravel은 기본적으로 모든 post 요청에 csrf 방어를 적용합니다.


좀 더 laravel 코드를 뜯어보면


라라벨에서는 web.php 라우터 파일에 적용된 request에 대해서


web이라는 middleware 그룹을 적용하는데


이 web이라는 middleware 그룹에는 여러개의 미들웨어들이 포함되어있는데 그중의 하나가 verifycsrftoken 입니다.


이 미들웨어가 csrf 공격을 막기 위한 것입니다.




csrf 란?


간단히 설명하자면 csrf 공격은 사이트간 요청 위조 공격인데


사용자가 자신의 의도와 무관하게 공격자의 스크립트로 인해서 특정 웹사이트에 


수정, 삭제, 등록과 같은 요청을 하도록 만드는 공격입니다.




그래서 라라벨은 이러한 공격을 막기 위해 csrf token을 생성하여 세션에 저장해두고


사용자가 진짜로 요청한 것이 맞는지 토큰을 비교하여 검사하게 됩니다.


토큰이 맞지 않는다면 유효하지 않은 요청으로 판단하게 됩니다.



문제는 세션이 만료되었을때 이 csrf token이 유효하지 않기 때문에 사용자는 갑자기 난데 없는 오류페이지를 보게 된다는 것인데요.


좀 더 정확히 상황을 설명하자면 특정 액션을 하는 폼이 있는 화면에서 사용자가 세션이 만료될때까지 아무런 액션을 취하지 않고 만료된 뒤에 해당 폼을 submit 하면


verifycsrftoken 미들웨어는 토큰이 맞지 않다는 오류를 뱉어내게 됩니다.



이에 대한 대처는 TokenMismatchException 에 대한 예외처리를 해주는것입니다.



app/Exceptions/Handler.php 에서



    public function render($request, Exception $exception)

    {

      if ($exception instanceof \Illuminate\Session\TokenMismatchException) {

            return redirect('/login')->withErrors(['email'=>'세션이 만료되었습니다. 다시 로그인해주세요.']);

        }

        

        return parent::render($request, $exception);

    }



render 메소드에 TokenMismatchException 에 대한 적절한 대응처리를 하시면 됩니다.

저작자 표시
신고

| 1 | 2 | 3 | 4 | 5 | ··· | 160 |

티스토리 툴바