PHP

PHP

    ›웹 개발 실전

    eBook

    • eBook 다운로드

    개발 환경 만들기

    • PHP 시작하기
    • 윈도우용 APM 설치
    • 리눅스용 APM 설치
    • 에디터 설치하기
    • APM 환경 테스트

    기초 문법

    • PHP 동작 방식
    • PHP는 무엇인가?
    • PHP 모드와 HTML 모드
    • 변수 - 타입과 문자열
    • 변수 - 배열, 객체, 널
    • 식별자
    • 변수의 범위
    • 상수
    • 연산자
    • 연산자 우선순위
    • 제어 구조 - if, match
    • 제어 구조 - 반복문
    • 제어 구조 - include, require, 예외 처리
    • 함수

    웹 개발 실전

    • 미리 정의된 변수와 외부 입력 처리
    • HTML 폼과 PHP
    • 쿠키와 세션
    • 파일 입출력
    • 방명록 만들기
    • 게시판 만들기
    • 계층형 게시판 만들기
    • 게시판 개선하기
    • 디버깅과 에러 처리

    쿠키와 세션

    카운터 이야기부터 시작합시다

    홈페이지에 "오늘 방문자 수", "총 방문자 수"를 표시하는 카운터 기억하시나요?
    카운터를 만드는 방법은 크게 세 가지가 있습니다.

    1. 일반 카운터 — 페이지를 새로 고칠 때마다 무조건 올라감
    2. 쿠키 카운터 — 브라우저를 닫기 전까지 단 1회만 올라감
    3. 세션 카운터 — 세션이 살아있는 동안 단 1회만 올라감

    이 차이를 이해하려면 먼저 쿠키와 세션이 뭔지 알아야 합니다.


    HTTP와 상태 문제

    웹은 기본적으로 "기억하지 않는" 구조로 되어있습니다.

    브라우저가 서버에 페이지를 요청하고, 서버가 응답하면 연결이 끊깁니다.
    다음 페이지를 요청하면 서버 입장에서는 "이 사람이 아까 그 사람인지" 알 방법이 없습니다.

    로그인 기능을 만들어야 한다고 생각해보세요.
    로그인 페이지에서 아이디/비밀번호를 확인했는데,
    다음 페이지로 이동하면 로그인 정보가 사라지는 겁니다.
    이걸 해결하는 방법이 쿠키와 세션입니다.


    쿠키 (Cookie)

    쿠키란 무엇이냐? 과자라구요? 하하.. 무릎 꿇고 두 손 드십시오. -_-;;

    쿠키는 서버가 사용자의 브라우저에 저장하는 작은 데이터입니다.

    놀이동산에 비유하면, 쿠키는 자유이용권입니다.
    입장할 때 자유이용권을 받으면 (쿠키 생성),
    그다음부터는 어떤 놀이기구 앞에 가도 자유이용권만 보여주면 됩니다.
    서버도 마찬가지로, 쿠키가 있으면 "아, 이 사람이구나" 하고 알아봅니다.

    쿠키의 특징:

    • 사용자 컴퓨터에 저장됩니다
    • 만료 시간을 설정할 수 있습니다
    • 브라우저를 닫으면 사라지거나, 설정한 시간까지 유지됩니다

    참고. 쿠키는 사용자가 직접 볼 수도 있고 수정할 수도 있습니다.
    그래서 "로그인 했다/안 했다" 같은 중요한 정보를 쿠키에 그대로 저장하면
    사용자가 값을 바꿔서 인증을 우회할 수 있습니다. 심각한 보안 문제입니다.

    쿠키 설정하기

    <?php
    setcookie(
        name:     'theme',       // 쿠키 이름
        value:    'dark',        // 저장할 값
        expires:  time() + 60 * 60 * 24 * 30, // 30일 후 만료
        path:     '/',           // 이 경로 이하에서 사용 가능
        domain:   '',            // 도메인
        secure:   true,          // HTTPS에서만 전송 (프로덕션에서 권장)
        httponly: true,          // JavaScript에서 접근 불가 (XSS 방어)
    );
    

    httponly: true는 꼭 설정하세요.
    이 옵션이 없으면 자바스크립트로 쿠키를 훔치는 XSS 공격에 취약합니다.

    쿠키 읽기

    <?php
    $theme = $_COOKIE['theme'] ?? 'light'; // 쿠키가 없으면 기본값 'light'
    echo $theme;
    

    쿠키 삭제하기

    만료 시간을 과거로 설정하면 브라우저가 쿠키를 삭제합니다.

    <?php
    setcookie('theme', '', time() - 3600, '/');
    

    세션 (Session)

    세션은 쿠키보다 한 단계 발전된 개념입니다.

    쿠키는 사용자 컴퓨터에 저장되지만,
    세션은 데이터를 서버에 저장하고 사용자에게는 ID만 쿠키로 줍니다.

    놀이동산 비유를 이어가면, 세션은 클로크룸(물품 보관소) 같은 겁니다.
    짐은 서버(보관소)에 있고, 사용자는 번호표(세션 ID)만 들고 다닙니다.
    매표소에 가도 번호표를 보여주면 서버에서 짐을 꺼내 확인합니다.

    그리고 세션은 쿠키보다 똑똑해서,
    사용자가 아무것도 안 하고 가만히 있으면 일정 시간 후에 자동으로 세션을 삭제합니다.
    "20분 동안 아무 놀이기구도 안 타고 있으니 나간 것 같군" 하면서요.
    (좀 잔인하죠?)

    세션의 특징:

    • 데이터가 서버에 저장됩니다 → 사용자가 마음대로 수정할 수 없습니다
    • 서버에 부하가 생깁니다 (쿠키보다 느릴 수 있음)
    • 일정 시간 후 자동 만료됩니다

    세션 시작하기

    <?php
    session_start(); // 반드시 HTML 출력 전, 파일 맨 위에서 호출합니다
    
    $_SESSION['user_id']   = 42;
    $_SESSION['user_name'] = '홍길동';
    

    세션 데이터 읽기

    <?php
    session_start();
    
    if (isset($_SESSION['user_id'])) {
        echo "안녕하세요, {$_SESSION['user_name']}님!";
    } else {
        // 로그인이 안 되어있으면 로그인 페이지로 보냅니다
        header('Location: /login.php');
        exit;
    }
    

    세션 삭제하기 (로그아웃)

    세션을 제대로 삭제하려면 세 가지를 해야 합니다.

    <?php
    session_start();
    
    $_SESSION = []; // 1. 세션 데이터를 비웁니다
    
    // 2. 세션 쿠키를 삭제합니다
    if (ini_get('session.use_cookies')) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params['path'], $params['domain'],
            $params['secure'], $params['httponly']
        );
    }
    
    session_destroy(); // 3. 서버의 세션 파일을 삭제합니다
    
    header('Location: /login.php');
    exit;
    

    세션 보안 — 꼭 챙겨야 할 것들

    로그인 후에는 세션 ID를 새로 발급하세요

    로그인 전에 발급된 세션 ID를 로그인 후에도 계속 쓰면
    세션 고정 공격(Session Fixation)에 취약합니다.
    로그인이 성공하는 순간 새 세션 ID를 발급해야 합니다.

    <?php
    session_start();
    
    // 로그인 성공 후
    session_regenerate_id(true); // 새 세션 ID 발급, 기존 세션 삭제
    $_SESSION['user_id'] = $userId;
    

    안전한 로그인 구현 예시

    <?php
    declare(strict_types=1);
    
    session_start();
    
    function login(PDO $pdo, string $email, string $password): bool {
        // 이메일로 사용자 조회
        $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE email = ?");
        $stmt->execute([$email]);
        $user = $stmt->fetch();
    
        // 사용자가 없거나 비밀번호가 틀리면 실패
        if (!$user || !password_verify($password, $user['password_hash'])) {
            return false;
        }
    
        session_regenerate_id(true); // 세션 고정 방어
        $_SESSION['user_id'] = $user['id'];
    
        return true;
    }
    

    비밀번호는 절대 평문으로 저장하면 안 됩니다.
    DB가 해킹당해도 비밀번호를 알 수 없도록 반드시 해싱해서 저장해야 합니다.
    PHP의 password_hash()와 password_verify()를 씁니다.
    MD5나 SHA1로 해싱하는 건 이미 안전하지 않다고 알려져 있으니 쓰지 마세요.


    쿠키 vs 세션 비교

    쿠키세션
    데이터 저장 위치사용자 브라우저서버
    보안낮음 (수정 가능)높음
    용량약 4KB서버 용량 한도
    속도빠름서버 조회 필요
    만료직접 설정설정값 또는 브라우저 종료 시
    적합한 용도테마, 언어 설정로그인, 권한 정보

    로그인 여부, 사용자 권한처럼 중요한 정보는 반드시 세션에 저장하세요.
    쿠키는 "다크 모드 선호", "언어 설정" 같이 바뀌어도 큰 문제 없는 것들에 씁니다.

    그럼 카운터는 어떤 걸 쓰는 게 좋을까요?
    일반 카운터는 새로 고칠 때마다 무조건 올라가서 부정확하고,
    세션 카운터는 서버 부담이 크고,
    쿠키 카운터가 가장 무난합니다.
    브라우저를 닫거나 쿠키를 지우기 전까지 한 번만 올라가니까요.

    Last updated on 2026-4-19 by Myeongjin Cho
    ← HTML 폼과 PHP파일 입출력 →
    • 카운터 이야기부터 시작합시다
    • HTTP와 상태 문제
    • 쿠키 (Cookie)
      • 쿠키 설정하기
      • 쿠키 읽기
      • 쿠키 삭제하기
    • 세션 (Session)
      • 세션 시작하기
      • 세션 데이터 읽기
      • 세션 삭제하기 (로그아웃)
    • 세션 보안 — 꼭 챙겨야 할 것들
      • 로그인 후에는 세션 ID를 새로 발급하세요
      • 안전한 로그인 구현 예시
    • 쿠키 vs 세션 비교
    커뮤니티
    PHP 공식 웹사이트한국 PHP 개발자 커뮤니티
    유용한 정보
    책 소스 코드
    Copyright © 2026 EZPHP.NET