Session & Cookie

1c2·2024년 3월 23일
0

back-end

목록 보기
3/3
  • Session & Cookie

    • http 프로토콜 특징
      • client가 server에 요청
      • server는 요청에 대한 처리를 한 후 client에 응답
      • 응답 후 연결을 해제. >> stateless
        • 지속적인 연결로 인한 자원낭비를 줄이기 위해 연결을 해제한다.
        • 그러나 client와 server가 연결 상태를 유지해야 하는 경우 문제가 발생 (로그인 정보 등).
        • 즉 client 단위로 상태 정보를 유지해야 하는 경우 Cookie와 Session이 사용됨.
    • HTTP protocol의 특징 (약점)을 보완하기 위해 사용
  • Cookie

    • 서버에서 사용자의 컴퓨터에 저장하는 정보파일.
    • 사용자가 별도의 요청을 하지 않아도 브라우저는 request시 Request Header에 넣어 자동으로 서버에 전송
    • key와 value로 구성되고 String 형태로 이루어져 있음
    • Browser마다 저장되는 쿠키는 다르다. (서버에서는 Browser가 다르면 다른 사용자로 인식).
  • Cookie의 사용 목적

    • 세션관리 : 사용자 아이디, 접속 시간, 장바구니 등의 서버가 알아야 할 정보를 저장.
    • 개인화 : 사용자마다 다르게 그 사람에 적절한 페이지를 보여줄 수 있다.
    • 트래킹 : 사용자의 행동과 패턴을 분석하고 기록
  • Cookie의 사용 예시

    • ID 저장 (자동 로그인).
    • 일주일간 다시 보지 않기.
    • 최근 검색한 상품들을 광고에 추천.
    • 쇼핑몰 장바구니 기능.
  • Cookie의 구성 요소

    • 이름 : 여러 개의 쿠키가 client의 컴퓨터에 저장되므로 각 쿠키를 구별하는 데 사용되는 이름.
    • 값 : 쿠키의 이름과 매핑되는 값.
    • 유효 기간: 쿠키의 유효 기간
    • 도메인 : 쿠키를 전송할 도메인
    • 경로 : 쿠키를 전송할 요청 경로.
  • Cookie의 동작 순서

    • Client가 페이지를 요청
    • WAS는 Cookie를 생성
    • HTTP Header에 Cookie를 넣어 응답
    • Browser는 넘겨받은 Cookie를 PC에 저장하고, 다시 WAS가 요청할 때 요청과 함께 Cookie를 전송.
    • Browser가 종료되어도 Cookie의 만료 기간이 남아 있다면 Client는 계속 보관.
    • 동일 사이트 재방문시 Client의 PC에 해당 Cookie가 있는 경우, 요청 페이지와 함께 Cookie를 전송
  • Cookie의 특징

    • 이름, 값, 만료일 (저장 기간 설정), 경로 정보로 구성되어 있다.
    • 클라이언트에 총 300개의 쿠키를 저장할 수 있다.
    • 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
    • 하나의 쿠키는 4kb까지 저장 가능하다.

메서드설명
new Cookie(String name, String value)새 쿠키를 생성함. 이름과 값은 문자열로 지정함.
void setValue(String newValue)쿠키에 저장된 값을 새 값으로 설정함.
String getValue()쿠키에 저장된 값을 반환함.
void setName(String name)쿠키의 이름을 설정함. (사용 빈도 낮음, 일반적으로 생성 시 이름 설정)
String getName()쿠키의 이름을 반환함.
void setMaxAge(int expiry)쿠키의 만료 시간을 설정함. 초 단위로 지정하며, 0은 쿠키를 즉시 삭제하도록 함. -1은 브라우저가 닫힐 때까지 유지됨.
int getMaxAge()쿠키의 최대 수명을 초 단위로 반환함.
void setPath(String uri)쿠키가 전송될 서버 상의 경로를 지정함. 이 경로를 포함하는 URL에서만 쿠키가 전송됨.
String getPath()쿠키의 경로를 반환함.
void setDomain(String domain)쿠키가 유효한 도메인을 설정함. 도메인은 쿠키를 공유할 수 있는 서버의 집합을 정의함.
String getDomain()쿠키에 설정된 도메인을 반환함.
void setSecure(boolean flag)쿠키의 보안 설정을 변경함. true로 설정하면 HTTPS를 통해서만 쿠키가 전송됨.
boolean getSecure()쿠키의 보안 설정을 반환함. HTTPS를 통해서만 전송되면 true를 반환함.
void setHttpOnly(boolean flag)쿠키를 HTTP와 HTTPS 프로토콜을 통해서만 접근하도록 설정함. JavaScript 등의 클라이언트 사이드 스크립트를 통한 접근을 방지할 수 있음.
boolean isHttpOnly()쿠키의 HttpOnly 설정을 반환함.
  • Session
    • 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.
    • WAS의 memory에 Object의 형태로 저장
    • memory가 허용하는 용량까지 제한 없이 저장 가능
  • Session의 사용 예
    • site내에서 화면을 이동해도 로그인이 풀리지 않고 유지
    • 장바구니
  • Session의 동작 순서
    • 클라이언트가 페이지를 요청
    • 서버는 접근한 클라이언트의 Request-Header필드인 Cookie를 확인하여, 클라이언트가 해당 Session-id를 보냈는지 확인.
    • session-id가 존재하지 않는다면, 서버는 session-id를 생성해 클라이언트에게 돌려준다.
    • 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장. 쿠키 이름 : JSESSIONID
    • 클라이언트는 재 접속 시, 이 쿠키(JSESSIONID)를 이용하여 session-id 값을 서버에 전달.
  • session의 특징
    • 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장.
    • 웹 서버에 저장되는 쿠키(=세션 쿠키)
    • 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
    • 저장 데이터에 제한이 없다.
    • 각 클라이언트 고유 Session ID를 부여한다.
    • Session ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스 제공.

메서드설명
HttpSession getSession()현재 요청과 관련된 세션을 반환하거나, 존재하지 않는 경우 새 세션을 생성함.
HttpSession getSession(boolean create)true를 전달하면 현재 세션이 존재하지 않을 경우 새로운 세션을 생성하여 반환. false인 경우 새 세션을 생성하지 않고 현재 세션이 존재하지 않으면 null을 반환함.
void setAttribute(String name, Object value)세션에 객체를 저장함. 주어진 이름으로 객체를 저장하며, 같은 이름으로 이미 저장된 객체가 있으면 새 객체로 대체됨.
Object getAttribute(String name)세션에서 주어진 이름의 객체를 반환함. 해당 이름의 객체가 없을 경우 null을 반환함.
void removeAttribute(String name)세션에서 주어진 이름의 객체를 제거함.
Enumeration<String> getAttributeNames()세션에 저장된 모든 객체의 이름을 Enumeration 객체로 반환함.
void invalidate()현재 세션을 무효화하고, 세션에 저장된 모든 속성을 제거함.
String getId()현재 세션의 고유 ID를 문자열로 반환함.
long getCreationTime()세션 생성 시간을 반환함. 1970년 1월 1일부터 세션 생성까지 경과된 시간을 밀리초로 표현함.
long getLastAccessedTime()세션에 마지막으로 접근한 시간을 반환함. 1970년 1월 1일부터 마지막 접근 시간까지의 경과 시간을 밀리초로 표현함.
void setMaxInactiveInterval(int interval)세션의 최대 비활성화 시간 간격을 설정함. 지정된 시간(초 단위) 동안 요청이 없으면 세션이 무효화됨.
int getMaxInactiveInterval()세션의 최대 비활성화 시간 간격을 초 단위로 반환함.

0개의 댓글