티스토리 뷰

세션? 쿠키?

보통 웹 페이지에서는 클라이언트가 서버에 요청을 하면,

서버는 요청에 대한 처리를 한 후 다시 클라이언트에게 응답합니다.

이때 지속적인 연결로 발생하는 자원낭비를 줄이기 위해

클라이언트에서 서버에 요청을 한 뒤 자동으로 연결을 해제하고,

서버에서 다시 클라이언트에게 응답을 한 뒤에도 자동으로 연결을 해제합니다.

하지만 로그인 정보 등과 같이 클라이언트와 서버가 연결 상태를 유지해야 하는 경우에는 문제가 발생합니다.

이와 같이 클라이언트 단위로 상태의 정보를 유지해야 하는 경우 Session과 Cookie를 사용합니다. 

 

먼저 세션에 대해 알아보겠습니다.

🔍세션 (Session) - 서버에 저장!

방문자가 웹서버에 접속해 있는 상태를 하나의 단위라고 하고, 세션이라고 표현합니다.

세션은 WAS의 memory에 Object 형태로 저장됩니다. Object 형태로 저장되기 때문에 직관적인 파일로 정보를 확인할 수 없습니다. 

또한 memory가 허용하는 용량까지 제한없이 저장이 가능합니다.

따라서 이러한 세션은 로그인 기능에 많이 사용됩니다.

site 내에서 화면을 이동해도 로그인이 풀리지 않고 유지되는 것, 장바구니에 제품을 담는 것 외에도 여러 기능들이 세션을 활용한 기능들입니다.

 

세션을 사용하는 방법들에 대해서 설명드리겠습니다.

 

✔ 세션의 생성

HttpSession session = request.getSession();
HttpSession session = request.getSession(false);

세션은 요청이 들어올 때 브라우저 별로 가지고 있는 Session ID에 해당하는 세션을 받아옵니다.

인자 값으로 true와 false를 받아옵니다. 

getSession을 사용할 경우, 세션이 기존에 만들어진 것이 있다면 그 세션을 리턴해주지만, 세션이 없을 땐

getSession(true) 혹은 getSession()은 새로운 세션을 만들어주고,

getSession(false) 일때는 null을 리턴하고 새로운 세션은 만들지 않습니다.

 

 

✔ 세션의 값 저장, 얻어오기, 제거

//저장
session.setAttribute(String name, Object value);

//얻어오기
Object obj = session.getAttribute(String name);

//제거
session.removeAttribute(String name) ;  //특정 이름의 속성 제거
session.invalidate();                           //연결되어있는 모든 속성 제거

세션의 값을 통한 제어는 Request와 유사합니다. 

Request는 요청되는 페이지까지만 유지가 된다면, 세션은 시간과 설정에 따라 범위가 결정됩니다.

값 제거에는 두 가지 방법이 있는데, remove를 사용한다면 특정 요소의 속성을 제거하고, invalidate는 연결되어있는 모든 속성을 제거하여 초기화시킵니다.

 

 

✔ 생성 시간과 마지막 접근 시간 불러오기

//생성시간
long ct = session.getCreationTime();

//마지막 접근 시간
long lat = session.getLastAccessedTime();

보통은 생성 시간보다

사용자가 어떤 것을 클릭했을 때, 클릭한 페이지가 세션의 어떤 값을 사용하면 다시 초기화되는 마지막 접근시간을 주로 사용합니다.

 

이 외에도 더 많은 세션에 대한 메서드가 궁금하신 분들은 api를 참조하셔도 좋을 것 같습니다.

https://docs.oracle.com/javaee/7/api/toc.htm 

 

세션과 다르게 쿠키는 무엇인지 알아보겠습니다.

🔍 쿠키 (Cookie) - Client 컴퓨터에 저장!

 

쿠키는 로컬 스토리지처럼 사용자 컴퓨터에 텍스트 파일로 저장되기 때문에 보안이 취약합니다. 

요즘은 보안성을 좀 높이고자 텍스트 파일 대신 확장자가 없는 파일이나 파일의 이름을 변경해서 저장하지만, 사용자의 컴퓨터에 저장된다는 것 자체가 보안성이 떨어진다고 할 수 있습니다.

또한 key와 value로 저장되어 있으며, 텍스트로 저장되기 때문에 문자열(String)만 저장할 수 있습니다.

 

만약 사용자의 컴퓨터에 특정 서버에 해당하는 쿠키가 있으면 사용자가 별도의 요청을 하지 않아도 브라우저가 request시 Request Header에 쿠키를 넣어 자동으로 서버에 전송합니다.

서버는 Header를 분석해서 사용자의 쿠키의 이름과 값을 확인하여 판단할 수 있습니다.

 

쿠키를 사용하는 이유는 3가지가 있습니다.

  1. 세션 관리 : 사용자의 아이디나 접속 시간, 장바구니 등 서버가 알아야 할 정보를 저장하여 서버에 전송할 때 자동으로 정보가 함께 전달됩니다.
  2. 개인화 : 사용자마다 다르게 적절한 페이지를 보여줄 수 있습니다. (ex. 네이버의 생일 축하 페이지)
  3. 트래킹 : 사용자의 행동과 패턴을 분석하여 기록합니다.

쿠키는 사용자의 컴퓨터가 달라지면 정보가 유지되지 않습니다.

가장 흔하게 사용되는 자동 로그인 역시 컴퓨터가 달라지면 유지가 되지 않아 쿠키를 사용하는 기능이라고 생각할 수 있고, 또는 팝업창의 "오늘 하루 보지 않기"기능, 쇼핑몰의 "오늘 본 상품" 등이 쿠키를 사용하는 기능들입니다.

 

 

✔ 쿠키의 구성 요소

어떤 site를 들어갔을 때, 개발자 모드로 쿠키를 확인해보면 다음과 같이 나타납니다.

이와 같이 쿠키는 이름(Name), 값(Value), 도메인, 경로, 유효기간으로 이루어진 것을 확인할 수 있습니다.

 

 

✔ 쿠키의 동작 순서

사용자는 서버에 페이지를 요청합니다. 서버는 요청을 받아 쿠키를 생성하고, HTTP Header에 쿠키를 넣어 응답합니다.

브라우저는 넘겨받은 쿠키를 컴퓨터에 텍스트 파일로 저장하고, 다시 서버에 요청할 때 요청과 함께 쿠키를 전송합니다.

쿠키는 브라우저가 종료되어도 만료기간이 남아있다면 사용자가 계속 보관을 하고 있고, 만료기간이 지났다면 자동 삭제됩니다.

 

쿠키를 사용하는 방법에 대해 알아보겠습니다.

 

✔ 쿠키 생성

Cookie cookie = new Cookie(String name, String value);

 

✔ 값을 변경

cookie.setValue(String value);

 

✔ 값 얻어오기

String value = cookie.getValue();

 

✔ 사용 도메인 지정 및 얻어오기

//사용 도메인 지정
cookie.setDomain(String domain);

//사용 도메인 얻어오기
String domain = cookie.getDomain();

 

✔ 값 범위지정 및 얻어오기

//값 범위 지정
cookie.setPath(String path);

//값 범위 얻어오기
String path = cookie.getPath();

 

✔ 쿠키의 유효기간 지정 및 얻어오기, 삭제

//쿠키의 유효기간 지정
cookie.setMaxAge(int expiry);

//쿠키의 유효기간 얻어오기
int expiry = cookie.getMaxAge();

//쿠키의 유효기간 삭제
cookie.setMaxAge(0);

 

✔ 생성된 쿠키를 사용자에 전송

response.addCookie(cookie);

 

✔ 사용자에 저장된 쿠키를 얻기

Cookie cookies[] = request.getCookies();

 

쿠키 역시 더 많은 메서드가 궁금하신 분들은 api를 참조하세요!

https://docs.oracle.com/javaee/7/api/toc.htm

댓글
공지사항
최근에 올라온 글