쿠키(Cookie) / 세션(Session) 정리

StrayCat·2026년 2월 16일

🎯 왜 쿠키와 세션이 필요할까?

HTTP 프로토콜은 무상태(Stateless) 특성을 가지고 있습니다. 즉, 서버는 클라이언트의 이전 요청을 기억하지 못합니다.

"로그인한 사용자가 다음 페이지로 이동하면 다시 로그인해야 한다면?"

이런 불편함을 해결하기 위해 쿠키세션을 사용하여 HTTP에 상태 정보를 유지(Stateful)합니다.


🍪 쿠키(Cookie)란?

개념

클라이언트(웹 브라우저)에 저장되는 작은 데이터 파일입니다.

구성 요소

요소설명
Name쿠키를 구별하는 키 (중복 불가)
Value쿠키에 저장된 값
Domain쿠키가 유효한 도메인
Path쿠키가 사용되는 경로
Expires쿠키의 만료 기한

쿠키 확인 방법

(Chrome기준) 개발자도구 → Application → Storage → Cookies에서 확인 가능합니다.

Spring에서 쿠키 생성하기

@RestController
@RequestMapping("/api")
public class AuthController {
    
    public static final String AUTHORIZATION_HEADER = "Authorization";
    
    @GetMapping("/create-cookie")
    public String createCookie(HttpServletResponse res) {
        addCookie("Tom Auth", res);
        return "createCookie";
    }
    
    // 쿠키 생성 메서드 (범용적으로 사용 가능하도록 static으로 선언)
    public static void addCookie(String cookieValue, HttpServletResponse res) {
        try {
            // Cookie Value에는 공백이 불가능하므로 인코딩 처리
            cookieValue = URLEncoder.encode(cookieValue, "utf-8")
                                    .replaceAll("\\+", "%20");
            
            // Name-Value로 Cookie 객체 생성
            Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue);
            
            // 쿠키가 유효한 경로 설정 (모든 경로에서 사용 가능)
            cookie.setPath("/");
            
            // 만료 시간 설정 (30분)
            cookie.setMaxAge(30 * 60);
            
            // Response 객체에 Cookie 추가하여 브라우저로 전송
            res.addCookie(cookie);
            
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}

Spring에서 쿠키 읽기

@GetMapping("/get-cookie")
public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
    System.out.println("value = " + value);
    return "getCookie : " + value;
}

핵심 포인트

  • @CookieValue 애노테이션을 사용하여 쿠키의 Name으로 Value를 간편하게 추출할 수 있습니다.

🔐 세션(Session)이란?

개념

서버에서 클라이언트의 상태를 일정 시간 동안 유지하기 위해 사용합니다.

동작 방식

  1. 클라이언트 → 서버: 첫 요청
  2. 서버 → 클라이언트: 고유한 세션 ID 생성 후 쿠키에 담아 응답 (예: JSESSIONID=12A345)
  3. 클라이언트: 세션 ID를 쿠키에 저장 (이를 '세션 쿠키'라고 함)
  4. 클라이언트 → 서버: 이후 요청 시 세션 ID를 쿠키에 포함하여 전송
  5. 서버: 세션 ID로 클라이언트를 식별하고 저장된 정보를 활용

Spring에서 세션 생성하기

@GetMapping("/create-session")
public String createSession(HttpServletRequest req) {
    // 세션이 존재하면 기존 세션 반환, 없으면 새로운 세션 생성 후 반환
    HttpSession session = req.getSession(true);
    
    // 세션에 정보 저장 (Name-Value 형식)
    session.setAttribute(AUTHORIZATION_HEADER, "Tom Auth");
    
    return "createSession";
}

핵심 포인트

  • req.getSession(true): 세션이 없으면 생성, 있으면 반환
  • 생성된 세션은 브라우저 쿠키에 JSESSIONID라는 이름으로 자동 저장됩니다.

Spring에서 세션 읽기

@GetMapping("/get-session")
public String getSession(HttpServletRequest req) {
    // 세션이 존재하면 반환, 없으면 null 반환 (새로 생성하지 않음)
    HttpSession session = req.getSession(false);
    
    // 세션에 저장된 값을 Name으로 조회
    String value = (String) session.getAttribute(AUTHORIZATION_HEADER);
    
    System.out.println("value = " + value);
    return "getSession : " + value;
}

핵심 포인트

  • req.getSession(false): 세션이 없으면 null 반환 (생성하지 않음)
  • getAttribute()로 세션에 저장된 값을 가져올 때는 형변환(Casting)이 필요합니다.

📊 쿠키 vs 세션 비교

구분쿠키(Cookie)세션(Session)
저장 위치클라이언트 (브라우저)서버
사용 예시"오늘 하루 보지 않기"로그인 정보 저장
만료 시점설정한 만료 시간까지 (브라우저 종료 후에도 유지 가능)브라우저 종료 시 / 로그아웃 시 / 서버 설정 시간 동안 재요청 없을 시
용량 제한도메인당 약 180개, 쿠키당 4KB서버 메모리가 허용하는 한 제한 없음
보안취약 (클라이언트에서 조작 가능)비교적 안전 (서버에 저장)
속도빠름 (서버 요청 불필요)상대적으로 느림 (서버 조회 필요)

💡 개발시 활용 팁

쿠키 사용 시 주의사항

  1. 민감한 정보는 쿠키에 저장하지 마세요: 클라이언트에서 조작 가능하므로 보안에 취약합니다.
  2. 쿠키 값은 인코딩하세요: 공백이나 특수문자 처리를 위해 URLEncoder를 사용합니다.
  3. 적절한 만료 시간을 설정하세요: 무한정 유지되는 쿠키는 보안 리스크가 될 수 있습니다.

세션 사용 시 주의사항

  1. 세션 타임아웃을 설정하세요: 서버 메모리 낭비를 방지합니다.
  2. 불필요한 데이터는 저장하지 마세요: 세션은 서버 메모리를 사용하므로 필수 정보만 저장합니다.
  3. 세션 클러스터링을 고려하세요: 여러 서버 환경에서는 세션 공유 방안이 필요합니다.

언제 무엇을 사용할까?

  • 쿠키: 자동 로그인, 팝업 "오늘 하루 보지 않기", 사용자 설정 정보
  • 세션: 로그인 인증 정보, 장바구니, 임시 저장 데이터

참고: 실제 프로젝트에서는 쿠키와 세션을 함께 사용하여 각각의 장점을 살립니다. 예를 들어, 세션 ID는 쿠키에 저장하고 실제 사용자 정보는 서버의 세션에 저장하는 방식입니다.

profile
알면 좋은 것보단 잊어버리기 싫은 것들을 기록합니다.

0개의 댓글