> PHP 프레임워크 > Laravel > Laravel 프레임워크에서의 세션 및 쿠키 메커니즘과 관련 애플리케이션

Laravel 프레임워크에서의 세션 및 쿠키 메커니즘과 관련 애플리케이션

L
풀어 주다: 2020-05-27 16:37:46
앞으로
3524명이 탐색했습니다.

Laravel 프레임워크에서의 세션 및 쿠키 메커니즘과 관련 애플리케이션

1. 쿠키의 출처

사용자가 웹사이트를 방문하면 웹 서버는 사용자가 웹사이트를 다시 방문할 때 일부 정보를 로컬 컴퓨터에 저장합니다. 사용자가 웹사이트에 로그인했는지 확인하십시오. 로그인한 경우, 로컬에 기록된 정보가 웹페이지로 전송되어 표시됩니다.

그럼 서버는 어떻게 사용자를 식별하나요? 우리 모두 알고 있듯이 http 프로토콜은 상태 비저장 연결입니다. 소위 상태 비저장 연결은 브라우저가 서버에 대한 요청을 시작할 때마다 연결을 거치지 않고 매번 새로운 연결을 설정한다는 의미입니다. 연결인 경우 서버 프로세스는 연결을 유지하고 일부 정보 상태를 메모리에 기억할 수 있습니다. 각 요청이 끝나면 연결이 닫히고 해당 콘텐츠가 해제되므로 상태가 기억되지 않고 무상태 연결이 됩니다. http 프로토콜을 기반으로 하는 서버의 경우 서로 다른 연결에 대해 서버는 이러한 연결이 모두 동일한 사용자로부터 온 것인지 식별할 수 없으므로 쿠키가 생성되었습니다.

서버에 처음 접속할 때 http 메시지에 쿠키가 없습니다. 이때 서버는 브라우저에 접속할 때 응답(응답) 다운스트림 HTTP 메시지에 쿠키 정보를 전달하도록 지시합니다. 동일한 도메인을 다시 사용하면 쿠키 정보가 요청(요청) 업스트림 HTTP 요청으로 전달되어 상태가 있는 HTTP 시뮬레이션을 실현합니다.

요약하자면 쿠키는 사실 작은 텍스트 정보 조각입니다. 클라이언트는 서버에 요청합니다. 서버가 사용자 상태를 기록해야 하는 경우 응답을 사용하여 클라이언트 브라우저에 쿠키를 발행합니다. 클라이언트는 쿠키를 저장합니다. 브라우저가 웹사이트를 다시 요청하면 브라우저는 요청된 URL을 쿠키와 함께 서버에 제출합니다. 서버는 이 쿠키를 확인하여 사용자의 상태를 식별합니다. 서버는 필요에 따라 쿠키의 내용을 수정할 수도 있습니다.

2. 쿠키의 내용 및 특성

쿠키의 주요 내용: 이름, 값, 도메인, 경로 및 만료 시간은 프로그램에 의해 설정됩니다. 빈 참조는 Domain 속성의 기본값입니다. 이 쿠키를 발행하는 페이지가 어느 디렉토리에 있는지에 관계없이 현재 URL의 도메인 이름 부분의 Path 속성의 기본값은 루트 디렉토리, 즉 " /", 이 쿠키를 발행하는 페이지가 어느 디렉토리에 있는지에 관계없이. 이 쿠키의 범위를 더욱 제한하기 위해 프로그램을 특정 경로로 설정할 수 있습니다. Expires 속성은 이 쿠키의 만료 날짜와 시간을 설정합니다. Expires 속성이 설정되지 않으면 브라우저 페이지가 닫힌 후 쿠키가 자동으로 사라집니다. 세션 쿠키라고 합니다. 세션 쿠키는 로컬 하드 디스크가 아닌 메모리에 존재합니다. 만료 시간이 설정되면 브라우저는 브라우저를 닫았다가 다시 연 후 쿠키를 하드 디스크에 저장합니다. 쿠키는 설정된 만료 날짜가 초과될 때까지 계속 유효합니다. 귀하의 하드 드라이브에 저장된 쿠키는 브라우저의 여러 프로세스 간에 공유될 수 있습니다.

쿠키 기능:

1. 쿠키는 암호화되지 않으며 마음대로 조작될 수 있으므로 매우 안전하지 않습니다.

2. 쿠키는 아래 그림과 같이 서로 다른 도메인 간에 공유할 수 없습니다.

Laravel 프레임워크에서의 세션 및 쿠키 메커니즘과 관련 애플리케이션

3. 세션 탄생 쿠키의 치명적인 단점을 보완하기 위해 세션 메커니즘은 클라이언트 상태를 기록하는 또 다른 메커니즘으로 만들어졌습니다. 세션은 서버에 저장되는 반면 클라이언트 브라우저에 저장됩니다. 클라이언트 브라우저가 서버에 액세스하면 서버는 세션이라고 하는 어떤 형태로든 서버에 클라이언트 정보를 기록합니다.

사용자가 서버에 연결하면 서버는 세션을 설정하고 서버는 session_id를 사용하여 어떤 사용자가 액세스하고 있는지 식별합니다. 사용자가 세션을 설정하면 사용자 인증이 성공하면 해당 사용자에게 고유한 쿠키를 제공할 수 있습니다. 사용자가 양식을 제출하면 서버가 이 양식 처리를 완료하면 브라우저가 자동으로 사용자의 SessionId를 HTTP 헤더 정보에 추가합니다. , SessionId에 해당하는 사용자에게 결과가 반환됩니다.

요약하자면 세션은 쿠키보다 암호화되어 더 안전합니다. 세션 생성 프로세스는 다음과 같습니다. 클라이언트 요청에 대한 세션을 생성할 때 서버는 먼저 요청에 session_id가 포함되어 있는지 확인합니다. . 서버가 session_id를 저장하지 않으면 session_id를 생성하고, 그렇지 않으면 이 클라이언트에 대한 세션을 생성하고 이 세션과 연관된 sessionId의 값은 반복되지도 않고 쉽게 찾을 수 없는 값입니다. 패턴에 따라 이 sessionId는 이 응답에서 클라이언트에 반환되고 위조된 문자열로 저장됩니다.

4. 쿠키와 세션의 유사점과 차이점

많은 사람들이 쿠키와 세션은 동일하고 차이점은 사용자에게 표시되는지 여부에 있다고 말합니다. 나 역시 이러한 관점에 동의한다. 쿠키는 로컬 브라우저에 저장되며, 운영 및 저장이 용이하고 서버 성능을 효과적으로 향상시킬 수 있다(메모리를 차지하지 않음). 안전하지 않은 일반 텍스트 및 제한된 크기로 세션이 서버 캐시에 저장되고 암호화되며 session_id 크기는 제한되지 않지만 서버 성능에 영향을 미칩니다.

쿠키와 세션 간의 연결에 관해 말하자면, 쿠키가 session_id의 전달자이므로 사용자는 클라이언트 브라우저 설정에서 쿠키를 비활성화할 수 있으므로 쿠키가 비활성화되면 세션도 비활성화됩니다. 사용할 수 없습니다. 그러나 종속성 문제를 해결하는 방법에는 두 가지가 있습니다. 하나는 단순히 URL 주소에 session_id 매개변수를 추가하는 것을 의미하며, 다른 하나는 서버가 자동으로 양식을 수정하고 숨겨진 필드를 추가하는 것입니다. 양식에 추가할 수 있습니다. 제출할 때 아래와 같이 session_id를 서버로 다시 전달할 수 있습니다.

Laravel 프레임워크에서의 세션 및 쿠키 메커니즘과 관련 애플리케이션

또 다른 연결은 여러 웹사이트(동일한 상위 도메인 및 다른 하위 도메인)가 있는 단일 서버의 경우입니다. , 우리가 해결해야 할 것은 공유하는 다른 웹사이트 간의 session_id입니다. 도메인 이름이 다르고(aaa.test.com 및 bbb.test.com) session_id가 자체 쿠키에 저장되므로 서버는 두 하위 사이트에 대한 액세스가 서로 다른 세션에서 발생한다고 생각할 것입니다. 해결 방법은 쿠키의 도메인 이름을 상위 도메인 이름으로 수정하여 session_id 공유를 구현함으로써 쿠키 공유 목적을 달성하는 것입니다. 단점은 하위 사이트 간 쿠키 정보도 동시에 공유된다는 점입니다.

5. laravel

session 애플리케이션

아래의 관련 애플리케이션은 config/session.php에서 다음과 같이 구성됩니다.

   'driver' => env('SESSION_DRIVER', 'file'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => null,
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'laravel_session',
    'path' => '/',
    'domain' => null,
    'secure' => false,
로그인 후 복사

드라이버 구성 항목은 세션 저장 방법을 설정하는 데 사용됩니다. 기본값은 다음과 같습니다. 스토리지인 파일 파일에서는 파일 구성 항목에서 설정한 경로, 즉 스토리지/프레임워크/세션에 파일이 위치한다. 또한 Laravel은 다른 저장 방법도 지원합니다:

database: 구성 항목 테이블에 의해 설정된 지정된 데이터 테이블에 세션 데이터 저장 memcached: Memcached에 세션 데이터 저장 redis: Redis 배열에 세션 데이터 저장: 세션 데이터 저장 이 구성은 테스트 환경에서만 사용됩니다. 드라이버 구성을 수정하려면 프로젝트 루트 디렉터리의 .env 파일로 이동하여 SESSION_DRIVER 옵션을 수정해야 합니다.

수명 구성 항목은 세션 유효 기간을 설정하는 데 사용되며 기본값은 120분입니다. 만료_on_close 구성 항목은 브라우저가 닫힐 때 즉시 세션을 무효화할지 여부를 설정하는 데 사용됩니다. 암호화 구성 항목은 세션 데이터의 암호화 여부를 구성하는 데 사용됩니다. 복권 구성 항목은 재활용 세션의 저장 위치를 ​​구성하는 데 사용됩니다. 쿠키 구성 항목은 세션 ID를 저장하는 쿠키 이름을 구성하는 데 사용됩니다. 기본값은 laravel_session입니다. 경로 구성 항목은 세션 ID를 저장할 쿠키 저장 경로를 구성하는 데 사용됩니다. 기본값은 프로젝트 루트 디렉터리입니다. 도메인 구성 항목은 세션 ID를 저장하는 쿠키 저장 도메인 이름을 구성하는 데 사용됩니다. 보안 구성 항목은 세션 ID가 HTTPS 프로토콜에서만 서버로 전송되는지 여부를 구성하는 데 사용됩니다.

세션 기능 사용

session(['site.xxx'=>'LaravelAcademy.org']);$site = session('site');dd($site);
로그인 후 복사

요청 요청 사용

모든 세션 데이터는 다음과 같은 방식으로 얻을 수 있습니다:

$sessions = $request->session()->all();
로그인 후 복사

세션 데이터에 다음과 같이 접근할 수 있습니다:

$request->session()->put('site', 'https://www.php.cn/');if($request->session()->has('site')){
    $site = $request->session()->get('site');
    dd($site);}
로그인 후 복사

또한 다음과 같은 세션 데이터를 얻을 수 있습니다. this(해당 세션이 없으면 기본값을 반환):

$sitename = $request->session()->get('sitename','Laravel');dd($sitename);
로그인 후 복사

또한 push 메소드를 사용하여 여러 데이터를 세션 배열에 푸시할 수도 있습니다.

$request->session()->push('site.xxx', 'https://www.php.cn/');$request->session()->push('site.xxx', 'Laravel');if($request->session()->has('site')){
    $site = $request->session()->get('site');
    dd($site);}使用pull方法,获取数据后删除使用flush方法,一次性删除所有session数据使用forget方法,删除某个session数据
로그인 후 복사

일회성 세션

If 일회성 세션 데이터가 유효한지 확인하려면 TestController@sessionx 코드를 다음과 같이 정의하면 됩니다.

public function sessionx(Request $request){
    $request->session()->reflash();
    $message = session('message');
    echo $message;}
로그인 후 복사

이렇게 하면 세션 데이터가 어떻게 새로 고쳐지더라도 항상 유효합니다. 또한 유효한 세션 데이터를 지정할 수도 있습니다.

$request->session()->keep(['message']);
로그인 후 복사

직접 라라벨 코드를 컴파일할 수도 있습니다.

class Middleware implements HttpKernelInterface{
    ...
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        $this->checkRequestForArraySessions($request);
        if ($this->sessionConfigured()) {
            $session = $this->startSession($request); // 启动session
            $request->setSession($session);
        }
        $response = $this->app->handle($request, $type, $catch); // 调用controller的method
        if ($this->sessionConfigured()) {
            $this->closeSession($session);         //关闭session
            $this->addCookieToResponse($response, $session);
        }
        return $response;
    }
    ...
 
    protected function closeSession(SessionInterface $session)
    {
        $session->save();    // 保存session
        $this->collectGarbage($session);
    }
}
로그인 후 복사

Cookie application

Add Cookie

예를 들어, "Hello"를 설정해야 합니다. , Laravel"을 컨트롤러 쿠키 값에 넣고 유효 기간을 10분으로 설정합니다. 쿠키가 응답에 자동으로 추가되므로 여기에서는 쿠키 대기열 메서드 Cookie::queue()를 사용하는 것이 좋습니다.

<?php
namespace App\Http\Controllers;
use Cookie;
use App\Http\Controllers\Controller;

class DashboardController extends Controller{
    public function index()
    {
        Cookie::queue(&#39;younger&#39;, &#39;Hello, dayang&#39;, 30);
        return view(&#39;welcome&#39;);
    }
 }
로그인 후 복사

Getting Cookie

쿠키 사용은 응답 및 요청과 분리될 수 없습니다. 쿠키 값을 얻는 데는 두 가지 수준이 있습니다. 하나는 서버이고 다른 하나는 클라이언트입니다. 서버가 쿠키 값을 가져오도록 하려면 요청에서 이를 가져와야 합니다.

public function index(Request $request)
{
    $cookie = $request->cookie(&#39;younger&#39;);
    dump($cookie);
}
로그인 후 복사

모든 쿠키의 값을 가져오려면 매개변수를 전달하지 않고 메소드를 사용할 수 있습니다.

public function index(Request $request){
    $cookies = $request->cookie();
    dump($cookies);
}
로그인 후 복사

Clear Cookie

쿠키 삭제 방법 비교 간단합니다. 만료 시간이 과거로 설정된다는 점만 빼면 원리는 쿠키 설정과 동일합니다. 여기에서는 make() 또는 잊어버리기() 메소드를 사용하여 쿠키를 HTTP 응답에 추가해야 합니다.

방법 1:

\Cookie::queue(\Cookie::forget(&#39;younger&#39;));或 \setcookie(&#39;younger&#39;, &#39;&#39;, -1, &#39;/&#39;);
로그인 후 복사

방법 2:

$cookie = Cookie::forget(&#39;younger&#39;);//return Redirect::route(&#39;index&#39;)->withCookie($cookie);
로그인 후 복사

더 많은 laravel 프레임워크 기술 기사를 보려면 laravel을 방문하세요. 튜토리얼!

위 내용은 Laravel 프레임워크에서의 세션 및 쿠키 메커니즘과 관련 애플리케이션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:jianshu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿