Laravel에 게시 요청-오류-419 죄송합니다. 세션 / 419 페이지가 만료되었습니다.


88

라 라벨 5.7을 설치했습니다.

파일에 양식 추가 \resources\views\welcome.blade.php

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

파일에 추가됨 \routes\web.php

Route::post('/foo', function () {
    echo 1;
    return;
});

POST 요청을 보낸 후 :

419 죄송합니다. 세션이 만료되었습니다. 새로 고침하고 다시 시도하세요.

버전에서는 5.6그런 문제가 없었습니다.


리디렉션을 추가해 보셨습니까? 대신 return;당신을 호출 할 수 있습니다 return redirect()->back();. 내가 볼 수 있듯이 앱은 게시 요청 후에 할 일이 없습니다. 요청을 처리 한 후 뷰로 리디렉션 할 수 있습니다.
dcangulo

1
나는 같은 문제가 있습니다. 데이터베이스 세션으로 전환하면 이런 일이 발생하고 다시 filefor SESSION_DRIVER로 변경하면 .env제대로 작동합니다. 데이터베이스 기반 세션이 작동하지 않는 이유는 무엇입니까?
Junaid Qadir 2018

정확한 코드를 새로운 laravel 5.7 설치에 복사했습니다. 효과가있었습니다. 그 밖에 문제가 있습니다.
Kyle Wardle 2011

이 문제는 토큰 문제 때문입니다. 이와 같은 코드를 실행하려고 시도했지만 오류가 발생하지 않습니다. 세션 드라이버, _token 값 디스플레이와 같은 추가 정보를 양식에 제공해야합니다. 또한,이 파일에 자신을 디버깅 할 수 있습니다 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php이유를 알고 라인 67
bangnokia에게

1
나는 sessions테이블을 다른 목적으로 사용했다는 것을 깨달았습니다 . 더 적합 하나 RAN이 테이블 이름을 변경 한 후 artisan session:table및 갱신 마이그레이션 모든 것이 잘 작동한다
Junaid 카디르

답변:


113

메이크업 아래 읽기 전에 반드시 당신은 @csrf{{ csrf_field() }}양식에 같은

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

larvel의 Session Expired 또는 419 Page Expired 오류 메시지는 csrf 토큰 확인이 실패하여 App\Http\Middleware\VerifyCsrfToken::class미들웨어가 이미 켜져 있음을 의미하기 때문에 나타납니다. 양식에서 @csrf블레이드 지시문이 이미 추가되었으므로 괜찮습니다.

확인해야 할 다른 영역은 세션입니다. csrf당신이 당신의 세션 드라이버에 문제가 발생할 수 있습니다 이러한 잘못 구성된 레디 스로, 작동 여부를 확인 할 수 있습니다 그래서 토큰 검증이 직접 세션으로 참여하고있다.

.env파일 에서 세션 드라이버 / 소프트웨어를 전환 해 볼 수 있습니다 . 지원되는 드라이버는 다음과 같습니다.

Laravel 5, Laravel 6 및 Laravel 7에서 지원되는 세션 드라이버 (Doc Link)

  • file -세션은 스토리지 / 프레임 워크 / 세션에 저장됩니다.
  • cookie -세션은 안전하고 암호화 된 쿠키에 저장됩니다.
  • database -세션은 관계형 데이터베이스에 저장됩니다.
  • memcached/ redis-세션은 이러한 빠른 캐시 기반 저장소 중 하나에 저장됩니다.
  • array -세션은 PHP 배열에 저장되며 유지되지 않습니다.

세션 드라이버를 전환 한 후 양식이 작동하는 경우 해당 특정 드라이버에 문제가있는 것입니다. 거기에서 오류를 수정하십시오.

오류가 발생하기 쉬운 시나리오

  • 아마도 파일 기반 세션은 /storage디렉토리 에 대한 권한 문제로 인해 작동하지 않을 수 있습니다 (빠른 인터넷 검색으로 솔루션을 가져올 수 있음). 또한 디렉토리에 777을 넣는 것은 결코 해결책이 아닙니다.

  • 데이터베이스 드라이버의 경우 DB 연결이 잘못되었거나 sessions테이블이 없거나 잘못 구성되었을 수 있습니다 (잘못된 구성 부분은 @Junaid Qadir의 의견에 따라 문제로 확인 됨).

  • redis/memcached 구성이 잘못되었거나 시스템의 다른 코드에 의해 동시에 조작되고 있습니다.

php artisan key:generate세션 데이터를 플러시하는 새 앱 키 를 실행 하고 생성 하는 것이 좋습니다 .

Clear Browser Cache HARD , 크롬과 파이어 폭스가 제가 기억할 수있는 것보다 더 많은 범인이라는 것을 알았습니다.

애플리케이션 키가 중요한 이유에 대해 자세히 알아보기


1
때로는 브라우저 만 해당됩니다. 주로 Chrome은 형식이 잘못되었거나 비표준이기 때문에 Set-Cookie 세션 값을 입력하지 않습니다. 따라서 Laravel은 _tokenFORM에서 받은 값 과 비교할 HTTP 요청에서 기존 세션 값을 찾지 않습니다 . SESSION_DOMAIN=...Chrome 및 HTTP 쿠키 사양 이 안전하지 않은 것으로 간주 하는 IP와 함께 사용하지 마십시오 .
KeitelDOG

나는 같은 문제가 있지만 계속해서 오류를받지 못합니다. 때때로 발생합니다. 99 %의 시간 동안 작동하기 때문에 세션 드라이버에 문제가 없음을 의미합니다. 하지만 저는 라이브 앱을 실행 중이며 때때로 고객으로부터 불만을받습니다. 하지만 매우 드뭅니다. 파일 세션 드라이버를 사용하고 있습니다. 누군가 내 경우에 왜 이런 일이 발생하는지 알고 있습니까? 감사합니다
TheAngelM97

@ TheAngelM97 로그인 또는 등록 페이지로 이동하여이 오류를 쉽게 재현 할 수 있습니다. 30 분 이상은 아무것도하지 마십시오. 그런 다음 제출을 클릭하면이 419 Page Expired나타납니다. 유용성을 위해 간단한 사용자에게 방금 일어난 일과 해결 방법을 어떻게 말합니까?
Pathros

38

이는 양식에 csrf가 필요하기 때문입니다. 버전 5.7에서는 @csrf로 변경했습니다.

<form action="" method="post">
    @csrf
    ...

참조 : https://laravel.com/docs/5.7/csrf


6
그의 양식에는 csrf 토큰이 포함됩니다. 그가 나중에 편집했는지 여부는 확실하지 않습니다.
eResourcesInc

그래, 그 형태는 원래 한 csrf필드, 난 그냥 편집 역사를 보았다
덱스터 Bengil

13

사례 1 : 127.0.01 : 8000과 같은 로컬 시스템에서 프로젝트를 실행하는 경우,

그때

SESSION_DOMAIN=.env 파일에 추가

또는 config / session.php에서 'domain' => env('SESSION_DOMAIN', ''),

그런 다음 실행 php artisan cache:clear

사례 2 : 프로젝트가 서버에서 실행 중이고 "mydomain.com"과 같은 도메인이있는 경우

SESSION_DOMAIN=mydomain.com.env 파일에 추가

또는 config / session.php에서 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

그런 다음 실행 php artisan cache:clear



9

나는 Laravel 5.7을 사용합니다. 동일한 문제가 있었고 csrf 토큰이 형식에 없기 때문에

@csrf

문제를 해결


7

주석 시도 \App\Http\Middleware\EncryptCookies::class에서 \app\Http\Kernel.php 나는 비슷한 문제를 가지고 그렇게함으로써 그것을 해결. 아마도 보안이 좋기 때문에 최선의 해결책은 아니지만 적어도 작동했습니다.

이전에는 시도했습니다.

  • 캐시 지우기
  • 새 앱 키 생성
  • 다양한 브라우저 (Chrome 70, Mozilla Firefox 57 및 IE 11)에서 내 앱 실행
  • 다른 컴퓨터에서 내 앱 실행
  • 주석 \App\Http\Middleware\VerifyCsrfToken::class\app\Http\Kernel.php
  • 주석 \Illuminate\Session\Middleware\AuthenticateSession::class\app\Http\Kernel.php
  • Laravel 업그레이드 및 다운 그레이드 (5.6 ~ 5.7 사이)

그러나 위의 어느 것도 나를 위해 일하지 않았습니다.

편집하다

여기서 제 경우는 로그인 할 때마다 새 세션 파일이 생성되고 (이전 파일은 여전히 ​​유지되지만 갑자기 잊혀졌습니다. 확인 storage/framework/sessions) 새 CSRF 토큰이 생성됩니다. 따라서 문제는 VerifyCsrfToken이 아닙니다.

@Vladd 코멘트 섹션에서 언급 한 바와 같이, 당신이해야 결코 주석하지 않습니다 \App\Http\Middleware\VerifyCsrfToken::class. 올바른 CSRF TOKEN을 서버로 보냈는지 확인해야합니다.


1
당신이 언급 한 방법들 중에서 \ app \ Http \ Kernel.php의 \ App \ Http \ Middleware \ VerifyCsrfToken :: class 만 주석 처리했습니다.
Lex Soft

1
캐시 지우기, 새 앱 키 생성 + 쿠키 제거
dobs

\ App \ Http \ Middleware \ VerifyCsrfToken :: class를 절대로 처리해서는 안됩니다. 왜 그렇게 하시겠습니까? 앱에서 자신의 약점을 만들려면?
Vladd

@dobs 가능한 모든 작업을 수행 한 후에도 419 오류가 발생하고 브라우저 쿠키를 지우거나 시크릿 모드에서 시도했을 때만 작동했기 때문에 '+ 쿠키 제거'를 추가해 주셔서 감사합니다.
Niraj Pandey

6

@csrfwelcome.blade.php에서 다음 으로 변경하십시오 .<input type="hidden" name="_token" value="{{ csrf_token() }}">

그래서 당신의 코드는 다음과 같습니다.

<form method="POST" action="/foo" >
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>

   <button type="submit">Submit</button>
</form>

6

세션에 문제가있을 수 있습니다. 이 설정을 가지고 놀다가 문제를 해결했습니다. 나에게 그것은 마지막 옵션으로 판명되었습니다.

  • 세션 드라이버로 "파일"을 사용하는 경우 새로 고침 후 세션이 저장되면 스토리지 / 프레임 워크 / 세션을 살펴보십시오. 그렇지 않은 경우 잘못된 폴더 권한 때문일 가능성이 큽니다. 저장소 / 폴더에 올바른 권한이 있는지 확인하십시오.
  • 페이지의 모든 자바 스크립트를 비활성화 (네비게이터 또는 코드 내에서 비활성화)하고 'http_only'=> true인지 확인하십시오.
  • https 유무에 관계없이 사용하십시오
  • SESSION_DRIVER 변수가 null이 아닌지 확인하십시오.
  • '암호화'=> 거짓과 '암호화'=> 참 사이를 전환 해보십시오.
  • 쿠키 이름 'cookie'=> 'laravelsession'을 변경하십시오.
  • SESSION_DOMAIN을 실제 도메인으로 설정하거나 null을 시도하십시오.
  • 'secure'=> env ( 'SESSION_SECURE_COOKIE', false) 및 'secure'=> env ( 'SESSION_SECURE_COOKIE', true)간에 전환 해보십시오.

출처 : Laravel Session은 항상 Laravel 5.4의 모든 새로 고침 / 요청을 변경합니다.


예, 다른 많은 작업을 시도한 후 SESSION_SECURE_COOKIE스위치 (로 변경됨 false)가 나를 위해 해주었습니다. (on localhost:8000)
Marten Koetsier

SESSION_SECURE_COOKIE도 저에게 문제 였는데, 웹 사이트 최적화 가이드를 따를 때 변경했습니다.
Bram Janssen 19

나를 위해 그것은 https와 함께 작동하지만 http와는 작동하지 않습니다 ... 왜 그런지 아십니까? 훌륭한 답변에 감사드립니다. 찾는 데 몇 시간이 걸렸습니다.
sharkyenergy

4

csrf 토큰을 추가하면 문제가 해결됩니다. {{csrf_token}} 또는 @csrf


4

이 오류를 해결하려면 먼저 다음 명령 중 하나를 양식 태그에 삽입해야합니다.

@csrf 또는 {{ csrf_field }}

문제가 해결되지 않으면 다음을 수행하십시오. (위의 명령 중 하나가 양식 태그에 있어야합니다.)

form 태그에 다음 명령 1.Insert 하나 @csrf또는{{ csrf_field }}

2. .env 파일을 열고 SESSION_DRIVER 섹션에서 값을 "파일"로 변경합니다.

3. 그런 다음 laravel 캐시를 재설정해야합니다. 터미널에 아래 명령을 입력하십시오

php artisan view:clear php artisan route:clear php artisan cache:clear

php artisan config:cache

4. 마지막 단계에서 서브에서 프로젝트를 분리하고 php artisan serve를 다시 클릭합니다.

문제가 해결되기를 바랍니다.


3

너무 많은 시간이 지난 후에 나는 이것을 이렇게 해결했습니다.

내 laravel 설치 경로가 구성 파일 session.php에 설정된 것과 동일하지 않았습니다.

'domain' => env('SESSION_DOMAIN', 'example.com'),

2

과도 할 수 있지만 이것을 시도해 볼 수 있습니다.

// 숨겨진 토큰 필드가 추가 된 명명 된 경로를 호출하는 양식 .

<form method="POST" action="{{ route('foo') }}" >
    @csrf
    <input type="hidden" name="_token" value="{!! csrf_token() !!}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

// 명명 된 경로

Route::post('/foo', function () {
    return 'bar';
})->name('foo');

// <head></head>블록 내에 다음을 추가합니다 .

<meta name="_token" content="{!! csrf_token() !!}" />

Laravel Installer 2.0.1을 사용하여 새로 설치 한 Laravel 5.7에서 Homestead를 사용하여 로컬에서 테스트했습니다. 당신의 환경은 무엇입니까?

이론 : 그와 블레이드 렌더링되는 HTML 태그를 함께 할 수있는 뭔가가 궁금 {{ }}{!! !!}환경에 또는 어떻게 당신이 그것을 제공된다 (예. php artisan serve). 무엇을 만드는 것은 내가 그 생각 line 335/vendor/laravel/framework/src/illuminate/Foundation/helpers.php수동 위 밖으로 입력 같은 라인을 렌더링합니다.


멋진 네,하지만 <meta>태그는 내에 배치해야한다 <head>가 아니라 내부 <body>. HTML 유효성 검사기가 이것을 좋아할지 모르겠습니다.
emix

나는 당신이 정확하다고 말하고 그것은 머리로 옮겨 져야합니다.
jeremykenedy

2

코드에 문제가 없습니다. 새 설치로 작성한 것과 동일한 코드로 확인했습니다.

양식 코드 :

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

web.php 파일 코드 :

Route::get('/', function () {
    return view('welcome');
});

Route::post('/foo', function () {
    echo 1;
    return;
});

양식 제출 후 결과는 다음과 같습니다. 양식 제출 후 출력

브라우저 캐시를 지우거나 다른 브라우저로 시도하면 고쳐질 것이라고 생각합니다.


2

빠르고 나쁜 방법은 app \ http \ middleware \ verifycsrftoken.php로 이동하여 $ except 목록에 경로를 추가하는 것입니다. 게시 요청은 CSRF 토큰 확인을 위해 무시됩니다.

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];

2

419 | 페이지 뜻이 오류 수단 laravel 보안 문제 토큰 필드 CSRF가 제대로 사용되지 않습니다.

사용하면 {{csrf_field}} 문제가 해결됩니다.


2

다음 단계를 모두 시도하면 작동합니다.

  1. 세션이 잘 구성되어 있는지 확인하고 가장 쉬운 방법은 파일을 만들고 저장소 폴더에 chmod 755 권한이 있는지 확인한 다음 .env아래와 같이 설정하면 파일 세션 드라이버가 가장 쉬운 설정 방법입니다.

    SESSION_DRIVER=file
    SESSION_DOMAIN=
    SESSION_SECURE_COOKIE=false
    
  2. 캐시 폴더가 지워지고 쓰기 가능한지 확인하십시오. 아래의 artisan 명령을 실행하여이를 수행 할 수 있습니다.

    php artisan cache:clear
    
  3. 폴더 권한이 잘 설정되어 있는지 확인하고 아래와 같이 구성해야합니다.

    sudo chmod -R 755 storage
    sudo chmod -R 755 vendor
    sudo chmod -R 644 bootstrap/cache
    
  4. 양식에 @csrf토큰이 포함되어 있는지 확인하십시오 .

이것이 문제를 해결할 수 있기를 바랍니다.


1

당신의 Http/Kernel.php

이 줄에 주석을 달아보십시오.

\Illuminate\Session\Middleware\AuthenticateSession::class,

웹 미들웨어 어레이에서

문제의 근원 일 수 있습니다.


1

기본적으로 나는이 문제가 없었습니다. 그래서 제가 한 일은 chmod -R 644 sessions 문제를 재현하는 것입니다.

여기에 이미지 설명 입력

나중에 세션 폴더에 대한 권한을 부여했습니다. chmod -R 755 sessions

이제 내 프로젝트 코드가 다시 작동합니다.

여기에 이미지 설명 입력

그 이유는 쓰기 권한이없는 파일에 캐시를 저장하기 때문입니다.

세션 구성 파일은 config / session.php에 저장됩니다. 이 파일에서 사용 가능한 옵션을 검토하십시오. 기본적으로 Laravel은 파일 세션 드라이버를 사용하도록 구성되어 있으며 많은 애플리케이션에서 잘 작동합니다. 프로덕션 애플리케이션에서는 더 빠른 세션 성능을 위해 memcached 또는 redis 드라이버 사용을 고려할 수 있습니다.

해결책 :

1-위에서 수정했듯이 세션 폴더에 755 권한을 부여 할 수 있습니다. 2-다른 세션 드라이버 구성을 사용할 수 있습니다.

파일-세션은 스토리지 / 프레임 워크 / 세션에 저장됩니다. 쿠키-세션은 안전하고 암호화 된 쿠키에 저장됩니다. 데이터베이스-세션은 관계형 데이터베이스에 저장됩니다. memcached / redis-세션은 이러한 빠른 캐시 기반 저장소 중 하나에 저장됩니다. array-세션은 PHP 배열에 저장되며 유지되지 않습니다.

명심하십시오. memcached / redis를 사용하려면 서버에 설치하거나 docker redis 컨테이너가 실행 중이어야합니다.


1

실제로 CSRF는 세션 기반 토큰입니다. 경로 그룹에 경로를 추가하고 세션을 제어하는 ​​미들웨어를 추가하십시오.

web은 laravel의 기본 미들웨어이며 세션 요청을 제어 할 수 있습니다.

Route::group(array('middleware' => ['web']), function () {
  Route::post('/foo', function () {
     echo 1;
     return;
  });
});

1

이미 csrf 지시문 이있는 경우 세션 실행 방식을 변경했을 수 있습니다.

이어 config/session.php, 체크 '보안' 필드. 서버에서 https를 사용할 수 없으면 false 여야합니다.

파일 (루트 디렉토리) SESSION_SECURE_COOKIE=FALSE에 넣을 수도 있습니다 .env.


1

프로젝트에서 명령 줄 cmd를 엽니 다.

1. 명령

php artisan config:cache

2.comand

php artisan route:clear

1

응용 프로그램의 헤더에도 csrf가 있습니까?

<meta name="csrf-token" content="{{ csrf_token() }}">

1

양식에이 있지만 @csrf여전히 표시됩니다.419 pages has expired

SESSION_SECURE_COOKIEconfig / session.php에서 옵션을 false로 업데이트 한 후 해결했습니다.

'secure' => env('SESSION_SECURE_COOKIE', false)

캐시 지우기보다


1

config / sessions.php로 이동하십시오.

행 찾기

'secure' => env('SESSION_SECURE_COOKIE', true),

거짓으로 변경

'secure' => env('SESSION_SECURE_COOKIE', false),

이 매개 변수가 TRUE로 설정되면 브라우저는 HTTPS 프로토콜을 사용해야하며 그렇지 않으면 세션을 저장하지 않습니다. 유효하지 않기 때문에


1

나는이 과정을 살펴 보았고 여기에 대답을 .. 제 경우에는 브라우저 기록을 지우는 것이 해결책이었습니다.


1

제 경우에는 route.php의 끝에?>가있었습니다. 거기에서 많은 시간을 보냈습니다 ...


동일, 나는 ?>끝에 추가 하는 것을 잊었다web.php
msalihbindak

0

나는 똑같은 문제가 있었고 완전히 어리석은 것이 나에게 달려있었습니다. 해당 양식을 제출하기 전에 javascript를 통해 모든 양식 필드 (제출 버튼이 아닌)를 비활성화했습니다! 물론 이로 인해 모든 양식 요소 (숨겨진 _token필드 포함)가 제출되지 않아 419 오류가 발생했습니다!

나는 이것이 몇 시간 동안 머리를 긁는 데 도움이되기를 바랍니다!

비활성화 된 양식 입력은 요청에 나타나지 않습니다.


0

오래 전에이 문제가 발생했습니다. 나는 그것이 storage/framework/sessions. chmod -R 0777 storage/framework/sessions명령 으로 변경할 수 있습니다 . 그것은 나를 위해 일했습니다.


0

제 경우에는 매우 우스꽝 스럽습니다. Auth::routes()라우트 파일 맨 위에 놓으면 오류 419가 발생 합니다.

Auth::routes();

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

그리고 Auth::routes();경로 파일의 맨 아래 로 이동하여 오류를 수정했습니다 .

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

Auth::routes();

아마도 그것은 당신의 경우에도 도움이 될 수 있습니다. 행운을 빕니다.


0

게시물 파일 크기 제한을 초과하는 큰 파일을 업로드하려고하면 오류 419가 발생합니다. 이 경우 upload_max_filesize 및 post_max_size를 합리적인 양으로 늘릴 수 있습니다 (예 : 10M 또는 20M은 사용 사례 및 리소스에 따라 다름). 여기에서 확인하십시오. https://stackoverflow.com/a/2184541/2100489

그러나 이로 인해 대역폭 및 스토리지와 같은 리소스 소비 문제가 발생할 수 있습니다. 해결책으로 양식을 제출하기 전에 파일 크기를 확인하고 경고 메시지를 표시 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.