Post

세션, 쿠키

세션, 쿠키

세션과 쿠키는 웹 환경에서 클라이언트(브라우저)와 서버 간의 상태를 유지하기 위한 핵심적인 기술입니다. HTTP 프로토콜은 기본적으로 “무상태(stateless)” 프로토콜이므로, 이전에 어떤 요청이 있었는지 기억하지 못합니다. 이러한 한계를 극복하고 사용자의 로그인 상태, 장바구니 내용 등을 유지하기 위해 세션과 쿠키가 사용됨

개념: 쿠키는 클라이언트의 웹 브라우저에 저장되는 작은 텍스트 파일입니다. 서버가 클라이언트에게 쿠키를 보내면, 브라우저는 이 쿠키를 저장하고 이후 동일한 서버에 요청을 보낼 때마다 해당 쿠키를 함께 전송합니다.

특징:

  • 저장 주체: 클라이언트(웹 브라우저)
  • 저장 방식: 텍스트 파일 형태로 브라우저에 저장 (key-value 쌍)
  • 저장 용량: 일반적으로 하나의 쿠키는 4KB까지 저장 가능하며, 도메인당 저장할 수 있는 쿠키의 개수도 제한적입니다 (약 20~50개).
  • 보안:
    • 클라이언트에 저장되므로 보안에 취약할 수 있습니다. 민감한 정보(비밀번호 등)는 저장하지 않는 것이 좋습니다.
    • XSS(Cross-Site Scripting) 공격에 노출될 수 있습니다. HttpOnly 속성을 사용하여 JavaScript 접근을 막아 보안을 강화할 수 있습니다.
    • Secure 속성을 사용하면 HTTPS 연결에서만 쿠키가 전송되도록 할 수 있습니다.
  • 수명(유효기간):
    • 세션 쿠키 (Session Cookie): expires 속성을 지정하지 않은 쿠키로, 브라우저가 종료되면 삭제됩니다.
    • 영구 쿠키 (Persistent Cookie): expires 속성을 지정하여 특정 날짜 또는 max-age 속성을 지정하여 특정 기간 동안 유지됩니다. 브라우저를 닫아도 삭제되지 않습니다.
  • 활용 예시:
    • 로그인 상태 유지 (자동 로그인)
    • 쇼핑몰 장바구니 (로그인하지 않은 경우)
    • 사용자 설정 정보 저장 (테마, 언어 등)
    • 팝업 “오늘 하루 이 창을 열지 않음” 기능
    • 방문 기록 추적 및 맞춤형 광고

동작 방식:

  1. 클라이언트가 웹 서버에 요청을 보냅니다.
  2. 서버는 응답과 함께 Set-Cookie 헤더에 쿠키 정보를 담아 클라이언트에 전송합니다.
  3. 클라이언트는 이 쿠키를 브라우저에 저장합니다.
  4. 이후 클라이언트가 동일한 서버에 다시 요청을 보낼 때마다 Cookie 헤더에 저장된 쿠키 정보를 자동으로 포함하여 전송합니다.
  5. 서버는 전송받은 쿠키 정보를 이용하여 클라이언트를 식별하거나 특정 작업을 수행합니다.

2. 세션 (Session)

개념: 세션은 클라이언트와 서버 간의 연결이 지속되는 동안 서버 측에 정보를 저장하는 기술입니다. 서버는 각 클라이언트에게 고유한 세션 ID를 부여하고, 이 세션 ID를 통해 해당 클라이언트의 상태 정보를 관리합니다. 세션 ID는 주로 쿠키(세션 쿠키)를 통해 클라이언트에게 전달됩니다.

특징:

  • 저장 주체: 서버 (웹 서버 또는 WAS의 메모리나 파일, DB 등)
  • 저장 방식: 서버 내부에 객체 형태로 저장
  • 저장 용량: 서버의 메모리나 저장 공간이 허용하는 한 대용량의 데이터를 저장할 수 있습니다.
  • 보안:
    • 데이터가 서버에 저장되므로 쿠키보다 보안에 유리합니다. 민감한 정보도 저장할 수 있습니다.
    • 세션 ID만 클라이언트에게 전달되므로, 데이터 자체는 노출되지 않습니다.
  • 수명(유효기간):
    • 기본적으로 브라우저가 종료되거나, 서버에서 설정한 세션 유효 시간(타임아웃)이 만료되면 세션이 만료되어 데이터가 삭제됩니다.
    • 세션 유효 시간은 웹 컨테이너 설정(web.xml 등)이나 프로그래밍적으로 설정할 수 있습니다.
  • 활용 예시:
    • 로그인 상태 유지 (가장 일반적인 용도)
    • 쇼핑몰 장바구니 (로그인 상태에서)
    • 사용자 인증 및 권한 관리
    • 복잡한 트랜잭션 과정 (여러 단계의 입력 데이터를 유지)

동작 방식:

  1. 클라이언트가 웹 서버에 접속합니다.
  2. 서버는 클라이언트에게 고유한 세션 ID를 발급하고, 이 세션 ID를 서버의 메모리(또는 파일, DB)에 저장합니다.
  3. 서버는 이 세션 ID를 Set-Cookie 헤더에 담아 클라이언트에 전송합니다. (이때 사용되는 쿠키가 JSESSIONID와 같은 세션 쿠키입니다.)
  4. 클라이언트는 세션 ID가 담긴 쿠키를 브라우저에 저장합니다.
  5. 이후 클라이언트가 동일한 서버에 요청을 보낼 때마다 세션 ID가 담긴 쿠키를 자동으로 포함하여 전송합니다.
  6. 서버는 전송받은 세션 ID를 통해 서버에 저장된 해당 클라이언트의 세션 정보를 찾아 사용합니다.

세션과 쿠키의 차이점 요약

구분쿠키 (Cookie)세션 (Session)
저장 위치클라이언트 (브라우저)서버
보안상대적으로 취약 (클라이언트 노출)상대적으로 우수 (서버에 데이터 저장)
저장 용량4KB 이하 (제한적)서버 자원이 허용하는 한 무제한
속도서버에 부담 적음 (매번 전송)서버에 부담 있음 (데이터 저장 및 관리)
만료 시점브라우저 종료 시 또는 지정 기간 만료 시브라우저 종료 시 또는 서버 설정 타임아웃 만료 시
주요 용도자동 로그인, 사용자 설정, 광고 트래킹로그인 상태 유지, 사용자 인증, 민감 정보 관리

일반적으로 보안이 중요하거나 많은 양의 데이터를 저장해야 할 때는 세션을 사용하고, 사용자 편의성 증진이나 트래킹 등 보안에 덜 민감한 데이터를 저장할 때는 쿠키를 사용합니다. 두 기술은 상호 보완적으로 사용되며, 웹 애플리케이션의 상태 관리에서 필수적인 요소입니다.

서드파티 쿠키란? 서드파티 쿠키는 사용자가 방문하는 웹사이트(퍼스트파티)가 아닌 다른 도메인(서드파티)에서 설정하는 쿠키입니다. 주로 광고, 트래킹, 사용자 행동 분석 등을 위해 사용됩니다. 예를 들어, 사용자가 A 사이트를 방문했는데, A 사이트에 삽입된 광고 플랫폼(서드파티)이 쿠키를 심는 경우입니다. 이 쿠키는 사용자가 어떤 사이트를 방문하든 추적하여 맞춤형 광고를 제공하는 데 활용됩니다.

왜 서드파티 쿠키가 없어지나? 주요 이유는 사용자 프라이버시 보호 강화입니다. 서드파티 쿠키는 사용자의 웹 활동을 광범위하게 추적할 수 있어 프라이버시 침해 논란이 계속되어 왔습니다. 이에 따라 주요 웹 브라우저들이 서드파티 쿠키 지원을 중단하겠다고 발표했습니다.

  • Safari (Apple): 이미 2020년부터 Intelligent Tracking Prevention (ITP) 기능을 통해 서드파티 쿠키를 기본적으로 차단하고 있습니다.
  • Firefox (Mozilla): 2019년부터 Enhanced Tracking Protection (ETP) 기능을 통해 서드파티 쿠키를 기본적으로 차단하고 있습니다.
  • Chrome (Google): 가장 큰 시장 점유율을 가진 Chrome도 서드파티 쿠키 지원을 2024년 하반기까지 단계적으로 중단할 예정입니다. (초기 발표는 2022년이었으나 여러 차례 연기되었습니다.) 현재는 일부 사용자에게 테스트 목적으로 서드파티 쿠키가 제한되고 있습니다.

서드파티 쿠키 중단의 영향:

  • 온라인 광고: 맞춤형 광고(타겟 광고) 및 광고 성과 측정에 큰 타격이 예상됩니다. 사용자 추적이 어려워지면서 광고 효율이 떨어질 수 있습니다.
  • 웹 분석: 사용자 행동 분석 및 트래킹 서비스가 어려워질 수 있습니다.
  • 데이터 비즈니스: 사용자 데이터를 기반으로 하는 비즈니스 모델에 변화가 필요합니다.
  • 로그인/인증: 간혹 서드파티 쿠키를 활용했던 SSO(Single Sign-On)와 같은 인증 방식에도 영향이 있을 수 있습니다.

대안은 무엇인가? 서드파티 쿠키의 대안으로 다양한 기술과 방법론이 논의되고 개발 중입니다. 구글은 “Privacy Sandbox” 이니셔티브를 통해 여러 대안 기술들을 제안하고 있습니다. 주요 대안으로는 다음과 같은 것들이 있습니다:

  • 퍼스트파티 데이터 활용 강화: 웹사이트 자체적으로 수집하는 사용자 데이터(로그인 사용자 데이터, 직접 상호작용 데이터 등)의 중요성이 더욱 커집니다.
  • Contextual Advertising (문맥 기반 광고): 사용자의 관심사를 추적하는 대신, 사용자가 현재 보고 있는 페이지의 콘텐츠와 관련된 광고를 제공하는 방식입니다.
  • Federated Learning of Cohorts (FLoC) / Topics API (Chrome): 사용자를 개별적으로 추적하는 대신, 비슷한 관심사를 가진 사용자들을 그룹(코호트)으로 묶어 코호트 수준에서 광고를 타겟팅하는 기술입니다. FLoC은 프라이버시 논란으로 Topics API로 대체되었습니다.
  • Data Clean Room: 여러 회사들이 서로의 원본 데이터를 직접 공유하지 않고도, 익명화된 데이터를 결합하여 분석할 수 있는 보안 환경입니다.
  • Universal ID 솔루션: 광고 기술 기업들이 퍼블리셔, 광고주와 협력하여 서드파티 쿠키 없이도 사용자 식별을 가능하게 하는 대체 ID 솔루션입니다.
  • 서버-사이드 트래킹 (Server-Side Tracking): 클라이언트 측에서 직접 쿠키를 설정하는 대신, 서버에서 데이터를 직접 수집하고 전송하는 방식입니다.

결론적으로, ‘쿠키가 없어진다’는 것은 정확히 말하면 웹 추적에 주로 사용되던 ‘서드파티 쿠키’의 역할이 축소되거나 사라진다는 의미입니다. 퍼스트파티 쿠키(사용자가 직접 방문한 사이트에서 설정하는 쿠키, 로그인 상태 유지 등)는 여전히 존재하며 웹사이트 기능 유지에 필수적으로 사용될 것입니다. 이 변화는 웹 생태계 전반에 걸쳐 상당한 변화를 가져올 것으로 예상됩니다. 이번에 주신 이미지는 JSP에서 세션을 관리할 때 사용하는 메서드들을 설명하고 있습니다. session 내장 객체를 통해 접근할 수 있는 주요 메서드들입니다.


세션 (Session) 관련 메서드

JSP에서 session 내장 객체는 javax.servlet.http.HttpSession 타입의 객체입니다. 이 객체를 사용하여 클라이언트의 세션 데이터를 관리할 수 있습니다.

메서드명설명
request.getSession()세션 영역(세션 객체)을 얻을 때 사용합니다. 만약 현재 클라이언트에게 할당된 세션 영역이 없으면 새로운 세션 영역을 생성하여 리턴하고, 이미 있으면 기존에 생성된 세션 영역을 참조합니다. <br> request.getSession(true) 메서드와 동일한 기능을 합니다. <br> 일반적으로 서블릿에서 세션을 처음 생성하여 사용할 때 지정합니다.
request.getSession(false)세션 영역을 얻을 때 사용합니다. 현재 클라이언트에게 할당된 세션 영역이 없으면 null을 리턴하고, 이미 있으면 생성된 세션 영역을 참조합니다. <br> 새로운 세션을 강제로 생성하는 것을 방지하고, 기존 세션이 있는지 확인하거나 접근할 때 주로 사용됩니다. <br> 일반적으로 세션을 사용하는 서블릿에서 주로 사용됩니다.
sess.getId()현재 세션 객체의 고유한 세션 ID 값을 반환합니다. 이 ID는 클라이언트의 쿠키(JSESSIONID)에 저장되어 서버로 전송되며, 서버가 클라이언트를 식별하는 데 사용됩니다.
sess.setAttribute(key, value)세션 영역에 속성(Attribute) 값을 설정합니다. key는 속성의 이름을 나타내는 String이며, value는 저장할 객체입니다. 이 값은 해당 세션이 유효한 동안 유지되므로, 브라우저를 종료하기 전까지 또는 세션이 만료되기 전까지 사용 가능합니다. <br> 기본적으로 30분 이상 요청이 없을 경우 세션이 비활성으로 간주되어 제거될 수 있습니다. (설정에 따라 변경 가능)
sess.getAttribute(key)세션 영역에 저장된 속성 값을 반환합니다. key에 해당하는 값이 없으면 null을 반환합니다. 반환되는 타입은 Object이므로, 실제 사용할 때는 적절한 타입으로 형 변환((String)sess.getAttribute("userId"))해야 합니다.
sess.removeAttribute(key)세션 영역에 저장된 특정 속성을 제거합니다. 예를 들어, 특정 사용자 정보를 세션에서 지우고 싶을 때 사용합니다.
setMaxInactiveInterval(sec)세션의 유효 시간(만료 시간)을 초(second) 단위로 설정합니다. 이 시간 동안 클라이언트로부터 아무런 요청이 없으면 세션이 만료되어 자동으로 제거됩니다. 웹 애플리케이션의 web.xml이나 서버 설정에서도 기본값을 지정할 수 있습니다.
getMaxInactiveInterval()현재 세션의 유효 시간(유지 시간)을 초(second) 단위로 반환합니다.
sess.invalidate()현재 세션 영역을 즉시 무효화하고 제거합니다. 세션에 저장된 모든 속성도 함께 삭제됩니다. 주로 로그아웃 기능 구현 시 사용되어 사용자의 세션을 강제로 종료시킵니다.

이러한 메서드들을 사용하여 JSP나 서블릿에서 로그인 상태 유지, 장바구니 관리, 사용자별 데이터 저장 등 다양한 세션 관련 기능을 구현할 수 있습니다.


세션 (Session)의 생성 및 제거 방법

세션은 웹 애플리케이션에서 클라이언트의 상태를 유지하기 위한 중요한 메커니즘입니다.

세션의 생성

  • 세션은 브라우저가 웹 애플리케이션에 처음 접속할 때 자동으로 생성됩니다.
    • request.getSession() 또는 request.getSession(true) 메서드가 호출될 때, 현재 클라이언트에게 할당된 세션이 없으면 새로운 HttpSession 객체가 생성되고 고유한 세션 ID가 부여됩니다. 이 세션 ID는 주로 클라이언트의 웹 브라우저로 세션 쿠키(JSESSIONID) 형태로 전송되어 저장됩니다.

세션의 제거 방법

세션은 크게 두 가지 방식으로 제거될 수 있습니다:

  1. time-out을 지정하여 제거 (유효 시간 만료): 세션은 일정 시간 동안 클라이언트로부터 아무런 요청이 없을 경우 자동으로 만료되어 제거됩니다. 이는 서버 자원의 효율적인 관리를 위함입니다.

    • 프로그래밍적으로 설정 (setMaxInactiveInterval(second) 사용):
      • session.setMaxInactiveInterval(sec) 메서드를 사용하여 세션의 유효 시간을 초(second) 단위로 설정할 수 있습니다.
      • 예시: Session.setMaxInactiveInterval(60*60*24);
        • 이는 세션이 24시간(60초 * 60분 * 24시간) 동안 비활성 상태일 경우 만료되도록 설정하는 것입니다.
      • 이 값은 브라우저별로 다르게 설정할 수 있습니다. (정확히는 브라우저별로 다른 세션을 가질 수 있고, 그 세션의 만료 시간을 다르게 설정할 수 있다는 의미입니다.)
    • web.xml 파일에 설정:
      • 웹 애플리케이션의 web.xml 파일에 <session-config> 태그를 사용하여 모든 브라우저(클라이언트)에 동일한 세션 타임아웃 값을 설정할 수 있습니다.
      • 설정 단위: 분(minute) 단위로 설정됩니다.
      • 예시:
        1
        2
        3
        4
        
          <web-app>
              <session-config>
                  <session-timeout>60</session-timeout> </session-config>
          </web-app>
        
      • 이렇게 설정하면, 모든 세션은 60분 동안 활동이 없으면 자동으로 만료됩니다.
  2. 즉시 제거하는 방법 (invalidate() 메서드 사용): 개발자가 특정 시점에 세션을 강제로 종료하고 싶을 때 사용합니다.

    • session.invalidate() 메서드를 사용합니다.
    • 예시: session.invalidate(); // 즉시 제거
    • 이 메서드가 호출되면 현재 클라이언트의 세션이 즉시 무효화되고, 세션에 저장된 모든 속성(데이터)이 제거됩니다.
    • 주로 로그아웃 기능을 구현할 때 사용되어, 사용자가 로그아웃하면 즉시 세션을 종료함으로써 보안을 강화하고 불필요한 세션 유지를 방지합니다.

세션에 저장된 특정 속성 값을 제거하는 방법

세션 객체 자체를 제거하는 것이 아니라, 세션 안에 저장된 수많은 데이터(속성) 중에서 특정 데이터만 제거하고 싶을 때 사용합니다.

  • session.removeAttribute(name) 메서드를 사용합니다.
  • 예시: session.removeAttribute("name");
    • 이는 세션 내에서 “name”이라는 키로 저장된 속성(데이터)만 제거합니다. 세션 자체는 계속 유지됩니다.
    • 예를 들어, 사용자 정보 중 비밀번호만 세션에서 지우고 싶을 때 유용하게 사용할 수 있습니다.

이러한 세션 관리 방법들을 통해 웹 애플리케이션은 사용자의 상태를 효율적이고 안전하게 유지할 수 있습니다.


쿠키는 웹 환경에서 클라이언트의 상태 정보를 유지하기 위한 핵심적인 기술 중 하나입니다.

쿠키의 개념

  • 사용자의 상태 정보를 클라이언트(웹 브라우저)에서 관리하는 메커니즘입니다.
  • 서버에 부담을 줄이고자 할 때 유용합니다. (세션은 서버에 데이터를 저장하므로 서버 부담이 더 큽니다.)
  • 사이트별로 300개까지 저장 가능하며, 하나의 쿠키당 4KB까지 저장 가능합니다. (일반적인 제한이며, 브라우저나 설정에 따라 다를 수 있습니다.)
  • 클라이언트(브라우저)의 브라우저 메모리나 OS 파일에 저장됩니다.
  • 기본적으로 브라우저 메모리에 저장되며, 브라우저가 종료되면 자동으로 쿠키가 제거됩니다.
  • 만료 시간(setMaxAge(age))을 설정하면, 지정된 시간까지 OS 파일에 저장되어 브라우저를 닫아도 유지됩니다.

이미지에 제시된 ‘쿠키의 동작 과정’ 다이어그램을 단계별로 설명합니다.

  1. 클라이언트(브라우저)에서 요청 전송:
    • 브라우저가 웹 서버에 HTTP 요청(GET /test.html HTTP/1.1)을 보냅니다. 이때는 아직 쿠키가 없습니다.
  2. 서버에서 쿠키 생성 및 응답:
    • 서버는 클라이언트의 요청을 처리한 후, 응답 메시지(HTTP/1.1 200 OK)의 헤더에 Set-Cookie 필드를 포함하여 클라이언트에게 쿠키를 보냅니다.
    • 예시: Set-Cookie: name=hong; tel=010-1234-1234; domain=korea.com
      • name=hongtel=010-1234-1234가 쿠키의 key=value 쌍입니다.
      • domain=korea.com은 이 쿠키가 유효한 도메인을 지정합니다.
  3. 브라우저에서 쿠키 저장:
    • 클라이언트의 브라우저는 서버로부터 받은 Set-Cookie 헤더를 확인하고, 해당 쿠키 정보를 브라우저의 메모리 또는 OS 파일(만료 시간이 설정된 경우)에 저장합니다.
    • 다이어그램에서는 “기간 설정 X -> (a) 브라우저 메모리”와 “기간 설정 O -> (b) 하드 디스크”로 구분하여 저장 위치를 보여줍니다.
  4. 재방문 시 쿠키 전송:
    • 이후 클라이언트가 동일한 서버(또는 쿠키의 도메인 범위 내)에 다시 요청을 보낼 때, 브라우저는 저장하고 있던 관련 쿠키 정보를 HTTP 요청 메시지의 Cookie 헤더에 자동으로 포함하여 서버로 전송합니다.
    • 예시: Cookie: name=hong; tel=010-1234-1234
  5. 서버에서 쿠키 이용:
    • 서버는 클라이언트로부터 전송받은 Cookie 헤더의 정보를 이용하여 해당 클라이언트를 식별하거나, 이전 상태 정보를 활용하여 적절한 응답을 생성합니다.

JSP/서블릿에서 쿠키를 생성하고 관리할 때 사용하는 Cookie 클래스의 주요 생성자와 메서드들입니다. (javax.servlet.http.Cookie 클래스)

생성자 및 메서드명설명
Cookie(name, value)새로운 쿠키 객체를 생성하는 생성자입니다. name(쿠키의 이름)과 value(쿠키의 값)를 String 타입으로 전달합니다.
response.addCookie(cookie)생성된 Cookie 객체를 HTTP 응답에 추가하여 클라이언트(브라우저)로 전송합니다. 이 메서드를 호출해야만 브라우저가 쿠키를 저장합니다.
request.getCookies()클라이언트로부터 전송된 모든 쿠키 정보를 Cookie 객체 배열로 리턴받습니다. 배열을 순회하며 원하는 쿠키를 찾아야 합니다.
setMaxAge(second)쿠키의 유효 시간(만료 시간)을 초(second) 단위로 설정합니다. 이 시간이 지나면 브라우저에서 쿠키를 자동으로 삭제합니다. 0으로 설정하면 즉시 쿠키를 삭제하고, 음수로 설정하면 세션 쿠키(브라우저 종료 시 삭제)가 됩니다.
getMaxAge()쿠키의 현재 유효 시간을 초 단위로 얻습니다.
getName()쿠키의 이름을 얻습니다.
getValue()쿠키의 값을 얻습니다.
setValue(value)쿠키의 값을 설정합니다.
length()(이 메서드는 Cookie 클래스에 직접적으로 존재하지 않습니다. 아마도 value의 길이를 의미하거나, 다른 라이브러리/개념과 혼동된 것으로 보입니다.) 일반적으로 String 타입의 value에 대해 value.length()를 사용하여 길이를 얻습니다.

This post is licensed under CC BY 4.0 by the author.