| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 디자인패턴
- SQL문법
- 객체지향
- dhgrp
- PHP객체지향
- docker
- 객체복제
- Laravel
- 어댑터패턴
- mcp client
- 라라벨
- SQL기초
- 매직메서드
- docker network
- MySQL
- MCP
- Agent Loop
- OOP
- linux 권한
- ai agent
- mcp server
- SQL
- 소프트웨어설계
- PHP
- LLM
- 데이터베이스
- 인덱스
- 데코레이터패턴
- Tool Calling
- ai 에이전트
- Today
- Total
개발블로그
[Laravel 데이터 및 상태 관리] 사용자 상태 관리 - Cookie와 Session 본문
사용자 상태 관리
상태(State)
사용자가 이전에 어떤 행동을 했는지, 현재 어떤 정보를 가지고 있는지를 의미
ex) 로그인 여부, 로그인한 사용자 정보, 장바구니, 이전 요청에서 입력한 값, 일회성 성공/오류 메세지
HTTP와 상태 관리
웹에서 클라이언트와 서버는 HTTP 요청과 응답을 통해 통신한다.
그런데 HTTP 기반 애플리케이션은 기본적으로 Stateless(무상태) 방식으로 동작
즉, 각각의 요청은 독립적으로 처리되며 서버가 이전 요청의 상태를 자동으로 기억하는 것은 아님
=> 여러 HTTP 요청 사이에서 사용자 정보를 유지할 방법이 필요
Laravel에서 상태를 관리하는 방법
대표적으로 Cookie와 Session 사용
| Cookie | 서버가 클라이언트의 브라우저에 데이터를 저장하고 이후 요청에서 다시 전달받을 수 있도록 하는 방식 |
| Session | 여러 요청에 걸쳐 특정 사용자와 관련된 정보를 유지하기 위한 기능 |
Cookie
개념
서버가 브라우저에 저장하도록 전달하는 작은 데이터
브라우저에 저장된 Cookie는 이후 해당 조건에 맞는 요청을 보낼 때 서버로 함께 전달될 수 있다.
따라서 서버는 이전 요청에서 저장해 둔 값을 다음 요청에서도 확인할 수 있음.
주요속성
| 속성 | 의미 |
| Name | Cookie 이름 |
| Value | 저장할 값 |
| Expires / Max-Age | Cookie 유지 기간 |
| Path | Cookie가 전달될 URL 경로 |
| Domain | Cookie를 사용할 도메인 |
| Secure | HTTPS 요청에서만 Cookie 전달 |
| HttpOnly | JavaScript에서 Cookie 접근 제한 |
| SameSite | 다른 사이트에서 발생한 요청에 Cookie를 전달할지 제어 |
문법
Cookie 생성
return response($content)
->cookie(
$name, // cookie 이름
$value, // cookie에 저장할 값
$minutes, // cookie 유지 시간(분)
$path, // cookie가 적용될 URL 경로 (/ 이면 전체)
$domain, // cookie가 적용될 도메인
$secure, // https요청에서만 cookie 전달 여부
$httpOnly, // 자바스크립트에서 cookie접근 제한 여부
$raw, // 값을 URL 인코딩하지 않을지 여부
$sameSite // 다른 사이트에서 요청할 때 Cookie 전달 정책
// strict - 다른 사이트에서 시작된 요청에는 매우 엄격하게 제한
// lax - 일부 일반적인 이동 요청에서는 허용
// none - 교차 사이트 요청에서도 허용
);
// cookie 만 따로 생성 (반드시 response에서 바로 만들 필요는 없음)
$cookie = cookie(
$name,
$value,
$minutes
);
return response('Hello')->withCookie($cookie); // 그리고 응답에 추가
/**
Cookie Queue => Queue에 먼저 등록한 뒤 최종 응답에 자동으로 포함 가능
*/
// 먼저 Facade를 불러옴
use Illuminate\Support\Facades\Cookie;
Cookie::queue(
$name,
$value,
$minutes,
$path,
$domain,
$secure,
$httpOnly,
$raw,
$sameSite
);
return response('Hello'); // 최종 Response를 만들 때 해당 Cookie를 응답에 추가
Cookie 조회
use Illuminate\Http\Request;
public function index(Request $request
// 보통 Controller메서드에서 Request를 주입받는다.
{
$value = $request->cookie($name);
// 존재하지 않으면 => null반환
}
| 값 | 의미 |
| $request | 현재 HTTP 요청 객체 |
| $name | 조회할 Cookie 이름 |
| $value | 조회된 Cookie 값 |
Cookie 삭제
// 방법1 : Response에서 Cookie 삭제
return response($content)
// $content : 응답 내용
->withoutCookie($name);
// $name : 삭제할 Cookie 이름
// 방법2 : Cookie::expire() 사용
use Illuminate\Support\Facades\Cookie;
Cookie::expire('theme');
return response('Cookie Deleted');
Laravel에서 Cookie의 특징
암호화
기본적으로 암호화되고 서명되며, 클라이언트에서 값이 변조된 경우 유효하지 않은 Cookie로 처리됨
Cookie 사용 시 주의점
브라우저에 저장되는 데이터이기 때문에 민감한 정보를 직접 저장하는 용도로 사용하는 것은 적절하지 않음
주요 보안 옵션
| 옵션 | 역할 |
| $secure | HTTPS 연결에서만 Cookie 전송 - true로 설정하면 HTTPS연결에서만 전달. |
| $httpOnly | JavaScript에서 Cookie 접근 제한 - true로 설정하면 브라우저 JavaScript가 해당 Cookie에 직접 접근하는 것을 제한 |
| $sameSite | Cross-Site 요청에서 Cookie 전송 범위 제어 |
Session
개념
여러 HTTP 요청에 걸쳐 사용자별 데이터를 유지하기 위한 기능
Laravel에서는 Session 데이터를 일정한 API로 다루고,
실제 데이터가 저장되는 위치는 설정한 Session Driver에 따라 달라짐.
Laravel의 Session 구조
Laravel Session
│
├─ Session API
│ ├─ 저장
│ ├─ 조회
│ ├─ 삭제
│ └─ Flash Data
│
└─ Session Driver
└─ 실제 데이터를 어디에 저장할지 결정
ex) file, cookie, database, redis, memcached, dynamodb, array 등
문법
Request 객체의 session() 메서드나 session() 헬퍼를 통해 Session 데이터를 저장하고 조회할 수 있음.
Session 저장
$request->session()->put($key, $value);
session([
$key => $value,
$key1 => $value2,
]);
// $key => Session에 저장할 데이터의 이름
// $value => 저장할 값
Session 조회
$value = $request->session()->get(
$key,
$default
);
Session 값 존재 여부 확인
$request->session()->has($key);
// 해당 Key가 존재하고 값이 null이 아닐 때 true를 반환
// Key 자체 존재 확인
$request->session()->exists($key);
Session 데이터 삭제
// 특정 값 하나 삭제
$request->session()->forget($key);
// 여러 값을 삭제
$request->session()->forget([
$key1,
$key2,
]);
// 전체 Session 데이터 삭제
$request->session()->flush();
Flash Data
개념
다음 요청까지만 유지되는 Session 데이터
용도
한 번만 보여주면 되는 값에 사용
ex) 처리 결과
문법
$request->session()->flash($key, $value);
// $key : Session Key
// $value : 저장할 값
/*
조회
*/
$value = $request->session()->get($key);
// blade에서 사용
/*
@if (session('status'))
<div>
{{ session('status') }}
</div>
@endif
*/
// Redirect와 함께 사용
return redirect($url)->with($key, $value);
// Flash Data 유지 기간 연장
$request->session()->reflash();
// 특정 Flash Data만 유지
$request->session()->keep($keys);
// 현재 요청에서만 Flash Data 사용
$request->session()->now(
$key,
$value
);
// 입력값 Flash
// : 폼 처리에서는 입력값 자체를 Flash Data로 저장할 수도 있음.
$request->flash();
$request->flashOnly($keys); // 일부 값만 저장
$request->flashExcept($keys); // 특정 값을 제외
/** blade에서 사용
<input
type="text"
name="email"
value="{{ old('email') }}"
>
*/
Session Driver
개념
Laravel의 Session API는 동일하게 사용하지만,
실제 Session 데이터를 어디에 저장할지는 Session Driver가 결정함.
특징
- Driver을 바꿔도 Session 사용법은 동일함.
설정
.env의 SESSION_DRIVER로 저장 방식을 지정
SESSION_DRIVER=DRIVER 이름
| Driver | 저장 위치 | 특징 |
| file | 서버 파일 주로 storage/framework/sessions 사용 |
간단한 로컬/단일 서버 환경에서 사용 |
| database | DB 테이블 | Session 데이터를 DB에서 관리 - Session 테이블이 필요함 php artisan make:sesion-table php artisan migrate 이후 Session 데이터가 해당 테이블을 통해 관리됨. |
| redis | Redis | 빠른 접근, 여러 서버에서 Session 공유에 유리 |
| cookie | 암호화된 Cookie | Session 데이터를 클라이언트 Cookie에 저장 |
| array | 메모리 | 요청이 끝나면 사라짐, 주로 테스트용 |
Session Lifetime
Session은 무기한 유지되지 않고 설정된 시간이 지나면 만료됨.
Lifetime 설정
파일 : config/session.php
Session 유지 시간은 lifetime 설정으로 지정 (분단위)
Lifetime 설정
방법1]
'lifetime' => env('SESSION_LIFETIME',120),
방법2] 환경변수에서 설정
SESSION_LIFETIME=120
브라우저 종료 시 만료
방법1]
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
방법2]
SESSION_EXPIRE_ON_CLOSE=true
용어
| 용어 | 의미 | 예시 |
| Session Cookie | Session ID를 브라우저에 보관하는 Cookie (브라우저의 Cookie에는 Session Data 전체를 저장하지 않음) |
myapp-session=abc123 |
| Session ID | 특정 Session을 찾기 위한 식별값 | abc123 |
| Session Data | 실제 Session에 저장한 데이터 | theme=dark, 로그인 정보 등 |

Session ID
확인방법
$id = $request->session()->getId();
// $request : 현재 HTTP Request 객체
// session() : 현재 요청의 Session 객체
// getId() : 현재 Session ID 반환
재생성
필요할 때 새로운 값으로 변경 할 수 있음.
로그인처럼 인증 상태가 바뀌는 시점에는 Session Fixation 공격을 방지하기 위해 Session ID를 재생성하는 것이 중요하고,
Laravel의 인증 기능은 인증 과정에서 이를 자동으로 처리한다.
// session id 재생성
$request->session()->regenerate();
// session id와 기존 session data까지 제거
$request->session()->invalidate();
재생성을 하는 이유
=> Session Fixation 공격 방지
: 공격자가 특정 Session ID를 미리 알고 있는 상태에서 사용자가 그 Session으로 로그인하면,
공격자가 같은 Session ID를 이용할 위험이 생길 수 있음.
ex) 로그인 성공 후, Session Id를 재생성
'STUDY > Laravel' 카테고리의 다른 글
| [Laravel 데이터 및 상태 관리] Redis 활용 (0) | 2026.08.14 |
|---|---|
| [Laravel 데이터 및 상태 관리] 성능 및 데이터 재사용 - Cache (0) | 2026.08.13 |
| Laravel 화면 데이터 구성 - Presenter, ViewModel, View Composer (0) | 2026.08.12 |
| Laravel 프로젝트 구조와 주요 클래스·MVC패턴 개요 (0) | 2026.08.11 |