webman 세션 관리

예시

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        $name = $request->get('name');
        $session = $request->session();
        $session->set('name', $name);
        return response('hello ' . $session->get('name'));
    }
}

$request->session();을 통해 Workerman\Protocols\Http\Session 인스턴스를 얻고, 인스턴스 메서드로 세션 데이터를 추가·수정·삭제합니다.

주의
세션 객체가 파괴될 때 세션 데이터가 자동으로 저장됩니다.
세션 객체를 전역 변수에 저장하면 객체가 파괴되지 않아 자동 저장이 되지 않습니다. 이 경우 수동으로 $session->save()를 호출하여 저장해야 합니다.

모든 세션 데이터 가져오기

$session = $request->session();
$all = $session->all();

배열을 반환합니다. 세션 데이터가 없으면 빈 배열을 반환합니다.

세션에서 특정 값 가져오기

$session = $request->session();
$name = $session->get('name');

데이터가 없으면 null을 반환합니다.

get 메서드의 두 번째 인자로 기본값을 전달할 수도 있습니다. 세션 배열에서 해당 값이 없으면 기본값을 반환합니다. 예:

$session = $request->session();
$name = $session->get('name', 'tom');

세션 저장

단일 데이터를 저장할 때는 set 메서드를 사용합니다.

$session = $request->session();
$session->set('name', 'tom');

set은 반환값이 없으며, 세션 객체가 파괴될 때 세션이 자동으로 저장됩니다.

여러 값을 저장할 때는 put 메서드를 사용합니다.

$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);

마찬가지로 put도 반환값이 없습니다.

세션 데이터 삭제

하나 또는 여러 세션 데이터를 삭제할 때는 forget 메서드를 사용합니다.

$session = $request->session();
// 한 항목 삭제
$session->forget('name');
// 여러 항목 삭제
$session->forget(['name', 'age']);

또한 delete 메서드가 제공됩니다. forget와 달리 한 항목만 삭제할 수 있습니다.

$session = $request->session();
// $session->forget('name'); 과 동일
$session->delete('name');

세션 값 가져오기 후 삭제

$session = $request->session();
$name = $session->pull('name');

다음 코드와 같은 효과입니다.

$session = $request->session();
$value = $session->get('name');
$session->delete('name');

해당 세션이 없으면 null을 반환합니다.

모든 세션 데이터 삭제

$request->session()->flush();

반환값이 없으며, 세션 객체가 파괴될 때 세션은 자동으로 스토리지에서 삭제됩니다.

특정 세션 데이터 존재 여부 확인

$session = $request->session();
$has = $session->has('name');

해당 세션이 없거나 값이 null이면 false, 그렇지 않으면 true를 반환합니다.

$session = $request->session();
$has = $session->exists('name');

위 코드도 세션 데이터 존재 여부를 확인합니다. 차이는 세션 값이 null이어도 true를 반환한다는 점입니다.

헬퍼 함수 session()

webman은 동일한 기능을 수행하는 헬퍼 함수 session()을 제공합니다.

// 세션 인스턴스 가져오기
$session = session();
// 아래와 동일
$session = $request->session();

// 값 가져오기
$value = session('key', 'default');
// 아래와 동일
$value = session()->get('key', 'default');
// 아래와 동일
$value = $request->session()->get('key', 'default');

// 세션에 값 설정
session(['key1'=>'value1', 'key2' => 'value2']);
// 아래와 동일
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// 아래와 동일
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);

설정 파일

세션 설정 파일은 config/session.php에 있으며, 내용은 다음과 같습니다.

use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;

return [
    // FileSessionHandler::class 또는 RedisSessionHandler::class 또는 RedisClusterSessionHandler::class 
    'handler' => FileSessionHandler::class,

    // handler가 FileSessionHandler::class이면 file,
    // handler가 RedisSessionHandler::class이면 redis
    // handler가 RedisClusterSessionHandler::class이면 redis_cluster(Redis 클러스터)
    'type'    => 'file',

    // handler별로 다른 설정 사용
    'config' => [
        // type이 file일 때 설정
        'file' => [
            'save_path' => runtime_path() . '/sessions',
        ],
        // type이 redis일 때 설정
        'redis' => [
            'host'      => '127.0.0.1',
            'port'      => 6379,
            'auth'      => '',
            'timeout'   => 2,
            'database'  => '',
            'prefix'    => 'redis_session_',
        ],
        'redis_cluster' => [
            'host'    => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
            'timeout' => 2,
            'auth'    => '',
            'prefix'  => 'redis_session_',
        ]

    ],

    'session_name' => 'PHPSID', // session_id를 저장하는 쿠키 이름
    'auto_update_timestamp' => false,  // 세션 자동 갱신 여부, 기본값은 끔
    'lifetime' => 7*24*60*60,          // 세션 만료 시간
    'cookie_lifetime' => 365*24*60*60, // session_id 쿠키 만료 시간
    'cookie_path' => '/',              // session_id 쿠키 경로
    'domain' => '',                    // session_id 쿠키 도메인
    'http_only' => true,               // httpOnly 사용 여부, 기본값은 켬
    'secure' => false,                 // HTTPS에서만 세션 사용 여부, 기본값은 끔
    'same_site' => '',                 // CSRF 공격 및 사용자 추적 방지, 값: strict/lax/none
    'gc_probability' => [1, 1000],     // 세션 가비지 컬렉션 확률
];

보안

세션 사용 시 클래스 인스턴스를 직접 저장하는 것은 권장하지 않습니다. 특히 신뢰할 수 없는 출처의 클래스 인스턴스는 역직렬화 시 보안 위험을 초래할 수 있습니다.