세션이 끊겼을 때 POST 통신을 통해 419 오류를 방지하는 방법

8008 단어 Laraveltech

개시하다


보안상의 이유로 세션의 지속 시간을 자주 설정하지만, 세션이 중단되었을 때의 대응은 무시하기 쉽다.
이번에는 라벨에서 세션이 끊긴 상태에서 POST 통신을 할 때 419 오류를 방지하는 방법을 살펴본다.

419 오류 방지 대응 방법


세션이 만료된 상태에서 POST 통신을 할 때 CSRF 토큰이 만료되어 419 오류가 표시됩니다.
그러나 이용자들은 419 잘못된 화면을 보고도 이유를 몰라 친근하다고 할 수 없었다.
이번에 제작된 서비스는 세션 유효기간이 끝나면 GET 통신을 할 때 로그인 화면으로 바뀌기 때문에 POST 통신의 경우도 마찬가지다.
Laavel에 오류가 발생했을 때의 행동에 관하여 공식 문서에는 다음과 같습니다.
오류와 예외 처리는 새 Lavel 프로젝트를 시작할 때 가장 먼저 설정됩니다.App\Exceptions\Handle r레벨은 응용 프로그램이 던지는 모든 예외를 기록하고 사용자에게 렌더링 서비스를 제공하는 곳입니다.
Laravel 8.오류 처리
따라서 App\Exceptions\Handler를 살펴보면render() 방법 내$e = $this->prepareException($e);에서 다음과 같다.
    /**
     * Prepare exception for rendering.
     *
     * @param  \Throwable  $e
     * @return \Throwable
     */
    protected function prepareException(Throwable $e)
    {
        if ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        } elseif ($e instanceof AuthorizationException) {
            $e = new AccessDeniedHttpException($e->getMessage(), $e);
        } elseif ($e instanceof TokenMismatchException) { // ここでCSFトークンが有効期限切れの場合は419エラーを返すようにしている
            $e = new HttpException(419, $e->getMessage(), $e);
        } elseif ($e instanceof SuspiciousOperationException) {
            $e = new NotFoundHttpException('Bad hostname provided.', $e);
        }

        return $e;
    }
CSRF의 유효기간이 만료되면 날아오지 않고prepareException() 방향을 바꾸는 것이 좋다.
따라서render() 방법을 다시 쓰기 위해app/Exceptions/Handler.php에 다음 코드를 추가했습니다.
 public function render($request, \Throwable $e)
    {
        if ($e instanceof TokenMismatchException) {
            return redirect()
                    ->back();
        }
        return parent::render($request, $e);
    }
세션의 유효기간이 지난 상태에서 POST 통신을 해도 419 오류가 발생하지 않고 로그인 화면으로 리디렉션할 수 있습니다!

최후


POST 통신을 하기 전에 장시간 방치하는 경우가 드물기 때문에 이번처럼 오류를 발견하는 경우는 드물다고 생각한다.
새로운 프로젝트에 참여할 때 여기서 잘 설정해서 발매했으면 좋겠어요.
끝까지 읽어주셔서 감사합니다!

참고 자료


https://gist.github.com/jrmadsen67/bd0f9ad0ef1ed6bb594e
https://qiita.com/kd9951/items/b1bccc4666976ec90dcc

좋은 웹페이지 즐겨찾기