0️⃣ 상단 요약 5줄

  • 쿠키는 브라우저(사용자 PC)에 저장되는 작은 정보입니다.
  • 세션은 서버에 저장되는 사용자 상태 정보입니다.
  • 대부분 로그인은 세션을 만들고, 세션 ID를 쿠키로 들고 다니는 방식입니다.
  • 쿠키에 비밀번호 같은 민감 정보를 저장하면 위험합니다.
  • 아래 예제로 “쿠키/세션이 실제로 어떻게 동작하는지” 바로 확인할 수 있습니다.

1️⃣ 상황으로 시작: “새로고침하면 왜 로그인 상태가 유지될까?”

처음 웹 개발을 할 때 제일 신기했던 게 이거였습니다.

  • 로그인 한 번 했는데
  • 새로고침을 해도
  • 다른 페이지로 이동해도
  • 계속 로그인 상태가 유지됨

그런데 HTTP는 기본적으로 기억력이 없습니다(stateless).
즉, 요청을 한 번 보내고 끝… “이 사람이 누구인지” 원래는 모릅니다.

그래서 로그인은 보통 이렇게 구현됩니다.

서버가 세션을 만들고 → 브라우저는 세션 ID를 쿠키로 저장 → 다음 요청마다 쿠키를 같이 보냄


2️⃣ 한 문장 정의

  • 쿠키(Cookie): 브라우저에 저장되는 정보
  • 세션(Session): 서버에 저장되는 사용자 상태 정보
  • 실무에선 대부분 세션 ID를 쿠키로 들고 다닌다

3️⃣ 한 장으로 정리: 차이점 표

구분쿠키세션
저장 위치브라우저서버
보안상대적으로 취약비교적 안전
용량작음비교적 자유
만료설정 가능서버 정책에 따름
주 용도식별자/설정로그인 상태/권한

4️⃣ 왜 둘을 같이 쓸까?

로그인은 “매 요청마다 이 사람이 누구인지” 알아야 합니다.

하지만 서버가 매번 “로그인 정보 전체”를 들고 다니게 하면 부담이고 위험합니다.

그래서 절충안이 등장합니다.

  1. 로그인 성공
  2. 서버가 세션 생성(서버 저장소에 user 정보 저장)
  3. 세션을 구분하는 세션 ID만 쿠키로 내려줌
  4. 다음 요청부터 브라우저는 쿠키(세션 ID)를 자동 전송
  5. 서버는 세션 ID로 사용자 확인

5️⃣ 미니 실습 1: PHP 세션 로그인/로그아웃

PHP는 session_start()만 해도
브라우저 쿠키에 **PHPSESSID(세션 ID)**를 자동으로 심습니다.

“세션 만들고 → 세션 ID를 쿠키로 내려준다”가 자동으로 구현되는 셈입니다.

login.php

<?php
session_start();$valid_user = "howinfo";
$valid_pass = "1234";$user = $_POST["user"] ?? "";
$pass = $_POST["pass"] ?? "";if ($user === $valid_user && $pass === $valid_pass) {
$_SESSION["user"] = $user;
$_SESSION["login_time"] = time();
echo "로그인 성공! <a href='mypage.php'>마이페이지</a>";
} else {
echo "로그인 실패. <a href='index.html'>다시 시도</a>";
}

mypage.php

<?php
session_start();if (!isset($_SESSION["user"])) {
echo "로그인이 필요합니다. <a href='index.html'>로그인</a>";
exit;
}$user = $_SESSION["user"];
$login_time = date("Y-m-d H:i:s", $_SESSION["login_time"]);echo "<h2>환영합니다, {$user}님</h2>";
echo "<p>로그인 시간: {$login_time}</p>";
echo "<a href='logout.php'>로그아웃</a>";

logout.php

<?php
session_start();
session_unset();
session_destroy();echo "로그아웃 완료. <a href='index.html'>처음으로</a>";

✅ 확인 포인트(진짜 중요한 부분)

  • 개발자 도구 → Application/Storage → Cookies
  • PHPSESSID 같은 값이 생겼으면 “세션 ID가 쿠키로 내려간 것”입니다.

6️⃣ 미니 실습 2: 쿠키를 직접 다뤄보기(자동 로그인 느낌)

주의: 비밀번호를 쿠키에 저장하는 건 금지입니다.
예제는 사용자명만 저장합니다.

set_cookie.php

<?php
setcookie(
"remember_user",
"howinfo",
time() + (60 * 60 * 24 * 7),
"/",
"",
true,
true
);echo "쿠키 저장 완료. <a href='read_cookie.php'>쿠키 확인</a>";

read_cookie.php

<?php
$user = $_COOKIE["remember_user"] ?? "";if ($user) echo "쿠키에 저장된 사용자: {$user}";
else echo "쿠키가 없습니다.";

7️⃣ 미니 실습 3: Python Flask 세션 로그인

Flask도 세션을 쓰면 내부적으로 세션 ID를 쿠키로 관리합니다.
즉 구조는 PHP와 같습니다.

설치:

pip install flask

app.py:

from flask import Flask, request, session, redirect, url_forapp = Flask(__name__)
app.secret_key = "howinfo-secret-key" # 실전에서는 환경변수 추천VALID_USER = "howinfo"
VALID_PASS = "1234"@app.route("/")
def home():
user = session.get("user")
if user:
return f"✅ 로그인 상태: {user} | <a href='/mypage'>마이페이지</a> | <a href='/logout'>로그아웃</a>"
return """
<h3>로그인</h3>
<form method="post" action="/login">
<input name="user" placeholder="user"><br>
<input name="pass" placeholder="pass" type="password"><br>
<button type="submit">로그인</button>
</form>
"""@app.route("/login", methods=["POST"])
def login():
user = request.form.get("user", "")
pw = request.form.get("pass", "")
if user == VALID_USER and pw == VALID_PASS:
session["user"] = user
return redirect(url_for("mypage"))
return "로그인 실패 <a href='/'>돌아가기</a>"@app.route("/mypage")
def mypage():
user = session.get("user")
if not user:
return redirect(url_for("home"))
return f"<h2>환영합니다, {user}님</h2><a href='/logout'>로그아웃</a>"@app.route("/logout")
def logout():
session.clear()
return redirect(url_for("home"))if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)

실행:

python app.py

접속:

  • http://localhost:5000

8️⃣ 자주 하는 실수 TOP3 (실무에서 진짜 많이 봄)

  1. 쿠키에 비밀번호/민감정보 저장
    → 세션 탈취/노출 시 바로 사고
  2. HTTPS 없이 로그인 운영
    → 세션 ID 가로채기 위험 증가
  3. 쿠키 보안 옵션을 안 줌
    → Secure/HttpOnly/SameSite는 기본값으로 넣는 게 안전

9️⃣ 체크리스트

  • 세션은 서버에, 세션 ID는 쿠키로 내려간다
  • 개발자 도구에서 쿠키(PHPSESSID 등)를 확인했다
  • 쿠키에 민감정보를 저장하지 않는다
  • Secure/HttpOnly/SameSite 옵션 의미를 안다
  • 쿠키 삭제 시 로그인 풀림을 직접 확인했다

FAQ

Q1. 자동 로그인은 쿠키만으로 구현하나요?
대부분은 “긴 만료 쿠키 + 서버 토큰(리프레시 토큰)” 조합을 씁니다.

Q2. 세션은 서버 메모리를 많이 쓰나요?
사용자가 많으면 부담이 됩니다. 그래서 Redis 같은 세션 저장소를 쓰기도 합니다.

Q3. 쿠키를 삭제하면 어떻게 되나요?
세션 ID 쿠키가 없어지면 서버는 사용자를 식별하지 못해서 로그인이 풀립니다.

이 글이 도움이 되었나요?좋아요/추천은 다시 누르면 취소됩니다.
hong
발행: 2026.02.15 최종 검토: 2026.02.21

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다