본문 바로가기

네트워크

[HTTP] 쿠키와 세션

개요

HTTP 프로토콜은 서버-클라이언트 통신 시 stateless 방식으로 통신합니다. 즉, 브라우저에서 새 웹 페이지를 열면 기존의 웹 페이지나 서블릿에 관한 어떤 연결 정보도 새 웹 페이지에서는 알 수 없습니다. 따라서 웹 페이지나 서블릿끼리 상태나 정보를 공유하려면 웹 페이지 연결 기능, 즉 세션 트래킹을 이용해야 합니다.

 

웹 페이지를 연동하는 방법은 다음과 같습니다.

  • <hidden> 태그 : HTML의 <hidden> 태그를 이용해 웹 페이지들 사이의 정보를 공유합니다.
  • URL Rewriting : GET 방식으로 URL 뒤에 정보를 붙여서 다른 페이지로 전송합니다.
  • 쿠키 :  클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지들이 공유합니다.
  • 세션 : 서버 메모리에 정보를 저장한 후 웹 페이지들이 공유합니다.

이 중 쿠키와 세션에 대해서 한번 알아보겠습니다.

쿠키(Cookie)

쿠키(Cookie)란 웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해 놓고 필요할 때 여러 웹 페이지들이 공유해서 사용할 수 있도록 매개 역할을 하는 방법입니다. 쿠키는 클라이언트 PC에 정보를 저장해서 사용하므로 보안에 취약합니다. 따라서 쿠키를 이용한 방법은 주로 보안과 무관한 경우에 한해 사용합니다. (예) "오늘은 더 이상 보지 않기 체크"

쿠키의 특징

  • 정보가 클라이언트 PC에 저장됩니다.
  • 저장 정보 용량에 제한이 있습니다. (파일 용량은 4kb)
  • 보안이 취약합니다.
  • 클라이언트 브라우저에서 사용 유무를 설정할 수 있습니다.
  • 도메인당 쿠키가 만들어집니다. (웹 사이트 하나당 하나의 쿠키가 만들어짐)

쿠키의 종류

속성 Persistence 쿠키 Session 쿠키
생성 위치 파일로 생성 브라우저 메모리에 생성
종료 시기 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 브라우저를 종료한 경우
최초 접속 시 전송 여부 최초 접속 시 서버로 전송 최초 접속 시 서버로 전송되지 않음
용도 로그인 유무 또는 팝업창을 제한할 때 사이트 접속 시 Session 인증 정보를 유지할 떄

Session 쿠키는 아래에서 다룰 Session 기능과 같이 사용됩니다.

쿠키 생성 과정

  1. 브라우저로 사이트에 접속합니다.
  2. 서버는 정보를 저장한 쿠키를 생성합니다.
  3. 생성된 쿠키를 브라우저로 전송합니다.
  4. 브라우저는 서버로부터 받은 쿠키 정보를 쿠키 파일에 저장합니다.
  5. 브라우저가 다시 접속해 서버가 브라우저에게 쿠키 전송을 요청하면 브라우저는 쿠키 정보를 서버에 넘겨줍니다.
  6. 서버는 쿠키 정보를 이용해 작업을 합니다.

쿠키 API

쿠키는 Cookie 클래스 객체를 생성하여 정보를 저장한 후 서버에서 클라이언트로 전송해 파일로 저장됩니다.

  • javax.servlet.http.Cookie를 이용합니다.
  • HttpServletResponse의 addCookie() 메서드를 이용해 클라이언트 브라우저에 쿠키를 전송한 후 저장합니다.
  • HttpServletRequest의 getCookie() 메서드를 이용해 쿠키를 서버로 가져옵니다.
메서드 설명
getComment() 쿠키에 대한 설명을 가져옵니다.
getDomain() 쿠키의 유효한 도메인 정보를 가져옵니다.
getMaxAge() 쿠키 유효 기간을 가져옵니다.
getName() 쿠키 이름을 가져옵니다.
getPath() 쿠키의 디렉터리 정보를 가져옵니다.
getValue() 쿠키의 설정 값을 가져옵니다.
setComment(String) 쿠키에 대한 설명을 설정합니다.
setDomain(String) 쿠키의 유효한 도메인을 설정합니다.
setMaxAge(int) 쿠키 유효기간을 설정합니다.
setValue(String) 쿠키 값을 설정합니다.
setPath(String) 쿠키의 디렉터리 정보를 설정합니다.

쿠키 생성 시 setMaxAge() 메서드 인자 값을 종류에 따라 Persistence 쿠키나 Session 쿠키로 저장됩니다. 인자 값이 음수이거나 쿠키 생성 시 setMaxAge() 메서드를 사용하지 않으면 Session 쿠키로 저장됩니다.

세션(Session)

웹 페이지들의 정보가 클라이언트 PC에 저장되는 쿠키와 달리 세션은 서버의 메모리에 생성되어 정보를 저장하고 위급 상황 발생 시 서버에서 세션을 삭제할 수 있기 때문에 웹 페이지에서 사용되는 정보 중 로그인 정보처럼 보안이 요구되는 정보는 대부분 세션을 이용합니다.

세션의 특징

  • 정보가 서버의 메모리에 저장됩니다.
  • 브라우저의 세션 연동은 세션 쿠키를 이용합니다.
  • 정보가 서버의 메모리에 저장되기 때문에 쿠키보다 보안에 유리합니다.
  • 서버에 부하를 줄 수 있습니다.
  • 브라우저(사용자)당 한 개의 세션이 생성됩니다.
  • 세션은 유효 시간을 가집니다. (기본 유효 시간 = 30분)
  • 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용됩니다.

세션 생성 과정

  1. 브라우저로 사이트에 접속합니다.
  2. 서버는 접속한 브라우저에 대한 세션 객체를 생성합니다.
  3. 서버는 생성된 세션 객체에 대한 세션 id를 클라이언트 브라우저에 전송합니다.
  4. 브라우저는 서버로부터 받은 세션 id를 브라우저가 사용하는 메모리의 세션 쿠키에 저장합니다.
  5. 브라우저가 재접속하면 브라우저는 세션 쿠키에 저장된 세션 id를 서버에 전달합니다.
  6. 서버는 전송된 세션 id를 이용해 해당 세션에 접근하여 작업을 수행합니다.

세션 API

서블릿에서 세션을 이용하려면 HttpSession 클래스 객체를 생성해서 사용해야 합니다.

  • getSession() : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성합니다.
  • getSession(true) : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성합니다.
  • getSession(false) : 기존의 세션 객체가 존재하면 반환하고, 없으면 null을 반환합니다.
메서드 설명
getAttribute(String name) 속성 이름이 name인 속성 값을 Object 타입으로 반환합니다.
해당되는 속성 이름이 없을 경우 null을 반환합니다.
getAttributeNames() 세션 속성 이름들을 Enumeration 객체 타입으로 반환합니다.
getCreationTime() 1970년 1월 1일 0시 0초를 기준으로 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 반환합니다.
getId() 세션에 할당된 고유 식별자를 String 타입으로 반환합니다.
getMaxInactiveInterval() 현재 생성된 세션을 유지하기 위해 설정된 세션 유지 시간을 Int 타입으로 반환합니다.
invalidate() 현재 생선된 세션을 소멸합니다.
inNew() 최초로 생성된 세션인지 기존에 생성되어 있었던 세션인지 판별합니다.
removeAttribute(String name) 세션 속성 이름이 name인 속성을 제거합니다.
setAttribute(String name, Object value) 세션 속성 이름이 name인 속성에 속성 값으로 value를 할당합니다.
setMaxInactiveInterval(int interval) 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정합니다.

'네트워크' 카테고리의 다른 글

OSI 7계층, TCP/IP 4계층  (0) 2023.05.24
[HTTP] HTTP, HTTPS, SSL Handshake  (0) 2022.11.28
[HTTP] TCP와 UDP의 특징 (TCP 3-way, 4-way handshake)  (0) 2022.11.27
[HTTP] 웹 통신 흐름  (0) 2022.05.14
[HTTP] 세션과 토큰  (0) 2022.03.14