세션 in 라라벨

hyHA·2024년 1월 21일

프로젝트를 진행하면서 세션 및 쿠키가 테스트에 계속 영향을 미쳐서 개념 정리와 라라벨에서 세션을 어떻게 저장하고 사용하는지 정리하였다. 이후에 세션과 관련하여 어떤 문제가 있었는지 정리할 예정이다.

세션이란

HTTP 기반의 애플리케이션은 상태를 저장할수 없기 때문에, 사용자의 정보를 저장하기위해서 세션을 사용한다.

이렇게 저장된 세션은 이후 후속 요청에서 엑세스하여 사용한다. 라라벨은 Memcached, Redis및 데이터베이스 등 다양한 세션 백엔드를 제공한다.

세션의 생성

세션은 아래 3가지 경우에 생성된다

  1. 사용자의 최초 방문
    사용자가 웹 애플리케이션에 접속할 때, 서버는 사용자에게 고유한 세션 식별자를 할당하고 이를 쿠키 등의 메커니즘을 사용하여 클라이언트에게 전달한다.

  2. 사용자 로그인
    사용자가 로그인할 때, 서버는 해당 사용자에 대한 세션을 생성하고 필요한 사용자 정보를 세션에 저장한다. 이를 통해 로그인 상태를 유지하고 사용자의 활동을 추적할 수 있다.

  3. 세션 유효시간 만료
    일정 시간이 지나면 세션은 만료될 수 있다. 이는 사용자가 일정 시간 동안 액세스하지 않으면 세션이 종료되고, 사용자가 다시 액세스할 때 새로운 세션이 생성된다.

설정하기

세션 설정파일은 config/session.php에서 설정한다.
기본적으로 라라벨은 file 세션 드라이버를 사용하도록 설정되어 있다.

애플리케이션이 다양한 웹 서버를 통해 로드 밸런싱되는 경우 Redis 또는 데이터베이스와 같이 모든 서버가 액세스할 수 있는 중앙 저장소를 선택해야 한다.

세션 driver 설정 옵션은 각각의 request(요청)에 따른 세션을 어디에 저장할 것인지 정의한다.

  • file : storage/framework/sessions 디렉토리에 세션을 저장
  • cookie : 암호화된 쿠키를 사용하여 안전하게 세션을 저장
  • database : 세션이 관계형 데이터베이스에 저장
  • dynamodb : 세션이 AWS DynamoDB에 저장
  • memcached / redis : 빠르고, 캐시를 기반으로한 memcached, redis 에 저장
  • array : 세션은 PHP 배열에 저장되며 지속되지 않는다.

데이터베이스

database 세션 드라이버를 사용하는 경우, 세션 레코드를 저장할 수 있는 테이블을 생성해야 한다

# 테이블 생성
Schema::create('sessions', function ($table) {
    $table->string('id')->primary();
    $table->foreignId('user_id')->nullable()->index();
    $table->string('ip_address', 45)->nullable();
    $table->text('user_agent')->nullable();
    $table->text('payload');
    $table->integer('last_activity')->index();
});

# 마이그레이션을 생성
php artisan session:table
php artisan migrate

Redis

Laravel과 함께 Redis 세션을 사용하기 전에 PECL을 통해 PhpRedis PHP 확장모듈을 설치하거나 Composer를 통해 predis/predis 패키지 (~ 1.0)를 설치해야

session 설정 파일에서 connection 옵션을 사용하여 세션에서 어떤 Redis 연결을 사용할지 지정할 수 있다

데이터 조회

글로벌 session 헬퍼를 사용

문자열을 인자로 호출하게 되면, 해당하는 세션 키에 대한 값을 반환

    Route::get('/home', function () {
        // Retrieve a piece of data from the session...
        $value = session('key');

        // Specifying a default value...
        $value = session('key', 'default');

        // Store a piece of data in the session...
        session(['key' => 'value']);
    });

Request 인스턴스를 통한 방법

# Request 인스턴스를 통해서 세션에 엑세스

public function show(Request $request, $id)
    {
        $value = $request->session()->get('key');

        //
    }

# 지정된 키가 세션 안에서 존재하지 않을 경우 디폴트값 반환
# get 메소드의 두번째 인자로 기본 값을 전달
$value = $request->session()->get('key', 'default');

$value = $request->session()->get('key', function () {
    return 'default';
});

모든 세션 데이터 조회

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

세션에 아이템이 존재하는지 확인

# 세션안에 아이템이 존재하는지 확인
# 아이템이 현재 존재하고 null이 아니라면 true를 반환

if ($request->session()->has('users')) {
    //
}

# 값이 null이더라도 세션안에 아이템이 들어 있는지 확인하려면 exists 메소드를 사용
if ($request->session()->exists('users')) {
    //
}

# 아이템이 null이거나 없는 경우 missing 메소드는 true를 반환

if ($request->session()->missing('users')) {
    //
}

데이터 저장

put (), 글로벌 session 헬퍼 사용

request 인스턴스의 put 메소드 또는 글로벌 session 헬퍼를 사용

// Via a request instance...
$request->session()->put('key', 'value');

// Via the global "session" helper...
session(['key' => 'value']);

세션에 들어 있는 배열에 값 추가

$request->session()->push('user.teams', 'developers');

데이터 삭제

데이터 삭제

// Forget a single key...
$request->session()->forget('name');

// Forget multiple keys...
$request->session()->forget(['name', 'status']);

# 세션에서 모든 데이터를 삭제
$request->session()->flush();

아이템 조회 & 삭제

pull 메소드는 세션에서 아이템을 가져오면서 삭제한다

$value = $request->session()->pull('key', 'default');

참고
https://laravel.kr/docs/8.x/session#HTTP%20%EC%84%B8%EC%85%98

profile
룰루랄라

0개의 댓글