새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

5 분 소요

목표 D-day : 88 일, 리마인트 : 13!!!

학습 목표

JSP가 제공하는 기본 객체인 쿠키세션에 대해서 학습합니다.

웹 개발에서 통신에 사용되는 프로토콜 중 HTTP는 본질적으로 상태를 유지하지 않는 stateless 프로토콜입니다. 서버는 각 요청이 독립적이며 이전 요청과 연결되지 않습니다.

쿠키와 세션은 이러한 상태를 유지하여 사용자가 불편하지 않도록 합니다.

키워드 정리

쿠키

  1. 클라이언트 저장 : 쿠키는 클라이언트(브라우저) 측에 저장됩니다.
  2. 만료 시간 : 쿠키에는 만료 시간이 설정될 수 있어, 특정 시간이 지나면 자동으로 삭제됩니다.
  3. 작은 데이터 : 보통 4KB 이하의 작은 데이터를 저장하는 데 사용됩니다.

세션

  1. 서버 저장 : 세션 데이터는 서버 측에 저장됩니다.
  2. 세션 ID : 클라이언트는 세션 ID를 통해 서버에 저장된 세션 데이터에 접근합니다.
  3. 보안 : 세션은 서버에서 관리되므로 민감한 정보가 클라이언트 측에 저장되지 않습니다.

결국은 HTTP는 상태를 유지 하지 않기 때문에 쿠키와 세션을 활용하여 유지할 수 있다.

쿠키는 간단한 데이터를 저장할 수 있고 클라에서 수정이 가능하므로 민감한 정보는 저장하지 말아야하며 세션은 서버에 데이터를 저장하기 때문에 서버에 부하를 줄 수 있다.

쿠키

쿠키는 웹 서버에서 웹 브라우저에게 우리 서버에 들어올 때 같이 보내세요! 정보입니다.

A 웹 서버에서 저장한 쿠키를 B 웹 서버에 방문할 때 들고 갈 수 없습니다.

대신 A 웹 서버와 같은 계열사에는 방문이 가능하도록 설정할 수 있습니다.

쿠키의 보안은 만료 시간, 도메인 설정, 경로 설정으로 웹 서버에 보낼 때 제한할 수 있습니다.

쿠키의 만료 시간이 정해지지 않으면 웹 브라우저가 닫히는 순간 사라집니다.

만약 만료 시간을 지정할 경우에는 웹 브라우저를 닫아도 남아 있습니다.

아이디 기억하기 방법

쿠키 만료 시간을 한달로 지정합니다.

성공하면 쿠키 정보에 자동 로그인에 필요한 정보를 저장합니다.

브라우저가 실행될때 로그인 관련 쿠키가 있으면 그 정보로 뒤집으면 됩니다.

쿠키와 헤더

Response 객체에 addCookie()를 활용하여 추가할 경우 실제로 Set-Cookie 헤더를 통해 전달됩니다.

한 개의 Set-height 헤더는 한 개의 쿠기 값을 전달합니다.

쿠키 이름=쿠키값 ; Domain=도메인; Path=경로값 ; Expires=GMT형식의만료일시

로그인 상태 유지

웹 사이트는 로그인 / 로그 아웃이 기본 기능입니다.

로그인을 하지 않은 경우 로그인을 유도하거나 접근 제한이 필요합니다.

로그인했는지 여부(상태)를 확인할 수 있는 방법이 있어한다는 의미입니다.

로그인 상태를 확인할 때 가장 많이 사용하는 방법이 쿠키를 이용하는 겁니다.

방식
  1. 로그인에 성공하면 특정 이름을 갖는 쿠키를 생성한다.
  2. 해당 쿠키가 존재하면 로그인 상태로 판단한다.
  3. 로그아웃하면 해당 쿠키를 삭제합니다.

쿠키 삭제

쿠키 삭제는 유효시간을 0으로 덮어쓰면됩니다.

쿠키 정리

쿠키는 사용자의 상태를 웹 브라우저에 저장할 수 있는 방식이다.

웹 서버별로

쿠키 내용을 변경하려면 UPDATE가 아니라 INSERT로 덮어씌우는 방식이다.

세션

쿠키는 웹 브라우저에 저장되는 사용자 상태 정보라면 세션은 웹 서버에 저장하는 사용자 상태 정보입니다.

사용자마다 다른 상태 정보를 관리하기 위해서 브라우저에 세션 ID를 저장하도록 하는데 저장할 때 쿠키를 사용할 수 있습니다.

  • 세션은 존재하지 않을 경우 자동 생성됩니다.
  • 세션은 지정한 유효 시간 동안 유지가 됩니다.
  • 세션에 저장된 속성은 세션과 동일한 유효 기간을 갖습니다.

쿠키와 차이점

쿠키는 도메인 설정으로 www.naver.com,mail.naver.com이 동일한 쿠키를 사용 할 수 있습니다.

세션은 도메인이 다를 경우 www.naver.commail.naver.com처럼 다른 경우 다른 세션 값을 가지게 됩니다.

이유는 세션은 웹 서버마다 저장하므로 서버가 다를 경우 공유가 되지 않는 다는 단점이 있습니다.

쿠키는 기본값이 없으며, 서버가 명시적으로 생성하고 설정해야 합니다. 기본적으로 브라우저 세션 동안 유지됩니다.

세션은 서버가 자동으로 생성하고 관리하며, 고유한 세션 ID, 생성 시간, 최근 접근 시간, 유효 시간을 기본 속성으로 가집니다.

세션 ID, 생성 시간, 최근 접근 시간, 유효 시간 등은 세션 관리에 중요한 역할을 하며, 이를 통해 사용자의 상태를 효율적으로 관리할 수 있습니다.

세션은 웹 서버에서 관리하므로 유효 시간을 무한대로 설정할 수 있지만,

쿠키는 웹 클라이언트에서 관리하므로 유효 시간을 무한대로 설정할 수 없습니다.

@page session 속성

  • session=”true” (기본값): 이 설정은 JSP 페이지가 요청을 처리할 때 세션이 자동으로 생성되도록 합니다. 세션이 이미 존재하면 기존 세션을 사용하고, 존재하지 않으면 새로운 세션을 생성합니다.
  • session=”false”: 이 설정은 JSP 페이지가 요청을 처리할 때 세션을 자동으로 생성하지 않도록 합니다. 세션이 필요하면 개발자가 명시적으로 세션을 생성해야 합니다.

즉 true로 설정할 경우 개발자는 별도의 세션 생성 로직을 작성하지 않아도 세션 객체를 사용할 수 있다는 장점이 있습니다.

단, 세션이 필요없는 코드에도 true로 할 경우 불피요한 세션 객체가 생성되기 때문에 false로 설정하는 것이 좋다고 생각됩니다.

세션 속성

세션은 간단하게 설명하면 웹 컨테이너에서 아주 큰 HashMap<String,Any> session의 구조를 가지고 있다.

웹 브라우저가 요청시 쿠키에 세션 id가 있습니다.

세션 id가 세션 자료구조의 key 이므로 session.get(sessionId)로 저장할 수 있는 공간을 찾아줍니다.

세션 종료

세션을 유지할 필요가 없으면 session.invalidate() 메서드를 사용해서 종료할 수 있습니다.

종료시 해당 세션 값을 삭제하고 내부에 저장된 속성도 삭제 됩니다.

세션을 사용하기 위해 파라미터로 받으면 자동으로 세션이 생성됩니다.

해당 세션 ID에 세션 KEY가 없는 경우 새로운 세션 객체가 생성되는 방식입니다.

세션 유효 시간

세션 유효 시간 설정 방식은 web.xml에서 설정하는 방법과 메서드로 설정하는 방법이 있습니다

만약 인수를 0으로 전달하면 유효 시간을 갖지 않습니다.

즉 명시적으로 세션을 해체하는 invalidate() 메서드를 호출하기 전까지 세션 객체가 서버에 유지됩니다.

세션 객체가 메모리에 남게 되어 메모리 부족 현상이 발생하게 됩니다.

스프링 과 세션

스프링 컨테이너는 @Controller 인수로 HttpSession자료형이 필요한 경우 세션 객체를 생성해서 만들어줍니다.

@page session=true와 유사하다고 생각하면 됩니다.

세션 명시적 사용

세션을 생성하는 방법은 크게 2가지입니다.

웹 컨테이너가 자동으로 만들어주는 방법인 @page session=true로 해당 로직에 세션을 생성해줍니다.

또하나는 @page session=false로 수동으로 웹 요청에서 세션을 가져올 수 있습니다.

request.getSession(boolean tf)를 통해 가져올 수 있으며 true일 경우에는 세션 객체가 반드시 반환됩니다.

해당 요청(브라우저)이 이미 세션 객체가 있다면 세션 객체가 반환이되며

해당 요청이 세션 객체가 없다면 새 세션 객체를 생성 후 반환합니다.

세션을 이용한 로그인 상태 유지

쿠키 방식과 동일합니다.

쿠키나 세션이나 저장되는 계층이 다를 뿐이지 로그인 유무 상태만 저장하면 됩니다.

다만 차이점은 세션은 웹 서버에서 유효 시간이 제한 없이 사용될 수 있으므로 반드시 세션 종료 로직이 들어가야합니다.

세션의 한계는 타입의 안정성이 없다는 것입니다.

세션 관리 방법

세션은 웹 브라우저마다 웹 서버에 관리되는 사용자 상태 정보입니다.

키와 값으로 세션에 저장하거나 조회할 수 있지만 사용자의 정보를 클래스로 관리한다면 유지보수가 더 간단하게 할 수 있습니다.

서블릿 컨택스트와 세션

서블릿 컨택스트를 구분하는 기준은 webapp/{folderName}여기서 folderName에 따라 애플리케이션 이름이 정해지게 됩니다.

만약 webapps/app1webapps/app2는 다른 서블릿 컨택스트를 가지게 됩니다.

다른 세션 ID를 사용하게 되는것입니다.

실제 실험으로 보면

work\apache-tomcat-9.0.85\webapps\myme\cookie.jsp : 이 서블릿은 쿠키를 등록합니다.

image-20240713175639663

work\apache-tomcat-9.0.85\webapps\app1\ses.jsp: 이 서블릿은 세션 id를 화면으로 보여줍니다.

image-20240713175544533

work\apache-tomcat-9.0.85\webapps\app2\ses.jsp: 이 서블릿은 세션 id를 화면으로 보여줍니다.

image-20240713175556620

주요 포인트

  • 컨텍스트(Context Path):
    • 각 웹 애플리케이션의 최상위 경로를 정의합니다.
    • 각 컨텍스트는 고유한 애플리케이션을 나타내며, 독립적으로 관리됩니다.
    • 예: /app, /app2
  • 경로(Path):
    • 컨텍스트 내의 특정 리소스나 기능을 구분하는 하위 경로입니다.
    • 동일한 컨텍스트 내의 경로는 같은 애플리케이션의 일부로 간주됩니다.
    • 예: /app/store, /app/store2
  • Tomcat과 같은 웹 서버에서는 각 웹 애플리케이션을 최상위 경로(Context Path)로 구분합니다.
  • 서로 다른 컨텍스트는 독립적인 애플리케이션을 의미하며, 같은 컨텍스트 내의 경로는 해당 애플리케이션의 일부입니다.
  • /app/store/app/store2는 동일한 컨텍스트 /app 내의 서로 다른 경로로 간주됩니다.

따라서 컨택스트 패스가 다를 경우 세션 ID가 다르며, 애플리케이션도 다르게 관리됩니다.

추가로 쿠키에 중요한 점을 알았습니다.

timeCookie.setPath("/"); // 쿠키 경로를 루트로 설정가 중요하다는 것을 알았습니다.

setPath("/")가 없는 경우 현재 path를 가지고 쿠키를 저장합니다.

path가 변경될 경우 보안으로 쿠키를 전송하지 않으므로 동일한 서블릿 컨테이너끼리 공유를 한다면 꼭 설정해야합니다.

정리

쿠키의 역할

  • 사용자 식별
  • 상태 유지
  • 사용자 설정 저장

세션의 역할

  • 사용자 상태 관리
  • 보안 강화된 데이터 저장
  • 복잡한 사용자 데이터 관리

백엔드 개발자로서 쿠키와 세션 관리 방법

  1. 쿠키 관리:
    • 보안 속성 설정: Secure, HttpOnly.
    • 데이터 최소화: 꼭 필요한 정보만 저장.
    • 암호화: 중요한 데이터 암호화 저장.
    • 쿠키 크기 관리: 쿠키 크기 제한 준수.
  2. 세션 관리:
    • 적절한 만료 시간 설정: 세션 타임아웃 설정.
    • 안정적인 저장소 사용: 데이터베이스, 분산 캐시 등.
    • 스케일링 대비: 세션 클러스터링 또는 분산 캐시 사용.
    • 보안 조치: 세션 ID 보호, 세션 고정 공격 방지.

댓글남기기