본문 바로가기

Spring

[Spring] 쿠키, 세션 사용하기

웹에서의 상태 유지 기술

  • HTTP프로토콜은 상태 유지가 안되는 프로토콜입니다.
    - 이전에 무엇을 했고, 지금 무엇을 했는지에 대한 정보를 갖고 있지 않습니다.
    - 웹 브라우저(클라이언트)의 요청에 대한 응답을 하고 나면 해당 클라이언트와의 연결을 지속하지 않습니다.
  • 상태 유지를 위해 Cookie와 Session기술이 등장합니다.

 

쿠키(Cookie)와 세션(Session)

  • 쿠키
    - 사용자 컴퓨터에 저장
    - 저장된 정보를 다른 사람 또는 시스템이 볼 수 있는 단점
    - 유효시간이 지나면 사라짐
  • 세션
    - 서버에 저장
    - 서버가 종료되거나 유효시간이 지나면 사라집니다.

쿠키

동작 방식

 

정의

  • 클라이언트 단에 저장되는 작은 정보의 단위입니다.
  • 클라이언트에서 생성하고 저장될 수 있고, 서버 단에서 전송한 쿠키가 클라이언트에 저장될 수 있습니다.

 

이용 방법

  • 서버에서 클라이언트의 브라우저로 전송되어 사용자의 컴퓨터에 저장합니다.
  • 저장된 쿠키는 다시 해당하는 웹 페이지에 접속할 때, 브라우저에서 서버로 쿠키를 전송합니다.
  • 쿠키는 이름(name)과 값(value) 쌍으로 정보를 저장합니다.
    - 이름-값 쌍 외에도 도메인(Domain), 경로(Path), 유효기간(Max-Age, Expires), 보안(Secure), HttpOnly 속성을 저장할 수 있습니다.

 

쿠키는 그 수와 크기에 제한

 

javax.servlet.http.Cookie

서버에서 쿠키 생성, Reponse의 addCookie메소드를 이용해 클라이언트에게 전송

Cookie cookie = new Cookie(이름, 값);
response.addCookie(cookie);
  • 쿠키는 (이름, 값)의 쌍 정보를 입력하여 생성합니다.
  • 쿠키의 이름은 일반적으로 알파벳과 숫자, 언더바로 구성합니다. 따라서, 한국어로 구성하면, 인코딩과 디코딩 과정이 필요하다.
  • 쿠키는 이름과 값을 String 으로 만들어주어야 한다.

 

클라이언트가 보낸 쿠키 정보 읽기

Cookie[] cookies = request.getCookies();
  • 쿠키 값이 없으면 null이 반환됩니다(매우중요).
    • getCookies 했을때, null인 경우 처리를 반드시 해주어야 한다(안그러면 널포인터익셉션!)
    • 처음 요청이 들어왔을땐, null일 것이기 때문에, 그에 대한 처리를 해주어야 한다
  • Cookie가 가지고 있는 getName()과 getValue()메소드를 이용해서 원하는 쿠키정보를 찾아 사용합니다.

 

클라이언트에게 쿠키 삭제 요청

  • 쿠키를 삭제하는 명령은 없고, maxAge가 0인 같은 이름의 쿠키를 전송합니다.

[참고]

  •  클라이언트 쪽에 똑같은 이름의 쿠키가 2개 생성될 수 없다
  • 서버 쪽에서는, 쿠키를 생성하는 것만 가능하다(삭제 불가능)
  • => 따라서, 쿠키를 삭제하는 것은 서버에서 maxAge가 0인 같은 이름의 쿠키를 생성하고, 전송하면 된다.
Cookie cookie = new Cookie("이름", null);
cookie.setMaxAge(0);
response.addCookie(cookie);

 

쿠키의 유효기간 설정

  • 메소드 setMaxAge()
    - 인자는 유효기간을 나타내는 초 단위의 정수형
    - 만일 유효기간을 0으로 지정하면 쿠키의 삭제
    - 음수를 지정하면 브라우저가 종료될 때 쿠키가 삭제
  • 유효기간을 10분으로 지정하려면
    - cookie.setMaxAge(10 * 60); //초 단위 : 10분
    - 1주일로 지정하려면 (7*24*60*60)로 설정합니다.

 

스프링MVC가 제공하는 쿠키 관련 어노테이션

[CookieValue]

 

@CookieValue(value="count", defaultValue="1", required=true) String value
  • (컨트롤러의 메서드에 HttpServletRequest 대신 만드는 것임)
  • 쿠키가 없으면, 생성한다.
    • [옵션] 
    • value : 쿠키의 이름 
    • defaultValue : 쿠키의 초기값
  • 쿠키가 있으면, String value를 통해 접근할 수 있다

세션

 

정의

  • 클라이언트 별로 서버에 저장되는 정보입니다.

 

이용 방법

  • 웹 클라이언트가 서버측에 요청을 보내게 되면 서버는 클라이언트를 식별하는 session id를 생성합니다.
  • 서버는 session id를 이용해서 key와 value를 이용한 저장소인 HttpSession을 생성합니다.
  • 서버는 session id를 저장하고 있는 쿠키를 생성하여 클라이언트에 전송합니다.
  • 클라이언트는 서버측에 요청을 보낼때 session id를 가지고 있는 쿠키를 전송합니다.
  • 서버는 쿠키에 있는 session id를 이용해서 그 전 요청에서 생성한 HttpSession을 찾고 사용합니다.

 

세션 생성 및 얻기

HttpSession session = request.getSession();
HttpSession session = request.getSession(true);
  • request의 getSession()메소드는 서버에 생성된 세션이 있다면 세션을 반환하고 없다면 "새롭게 세션을 생성"하여 반환합니다.
  • 새롭게 생성된 세션인지는 HttpSession이 가지고 있는 isNew()메소드를 통해 알 수 있습니다.

 

HttpSession session = request.getSession(false);
  • request의 getSession()메소드에 파라미터로 false를 전달하면, 이미 생성된 세션이 있다면 반환하고 없으면 "null"을 반환합니다.

 

세션에 값 저장

setAttribute(String name, Object value)
  • name과 value의 쌍으로 객체 Object를 저장하는 메소드입니다.
    • string, object 쌍임
  • 세션이 유지되는 동안 저장할 자료를 저장합니다.
session.setAttribute(이름, 값)

 

세션에 값 조회

getAttribute(String name) 메소드

  • 세션에 저장된 자료는 다시 getAttribute(String name) 메소드를 이용해 조회합니다.
  • 반환 값은 Object 유형이므로 저장된 객체로 자료유형 변환이 필요합니다.
  • 메소드 setAttribute()에 이용한 name인 “id”를 알고 있다면 바로 다음과 같이 바로 조회합니다.
String value = (String) session.getAttribute("id");

 

세션에 값 삭제

  • removeAttribute(String name)
    - name값에 해당하는 세션 정보를 삭제합니다.
  • invalidate()
    - 모든 세션 정보를 삭제합니다.

 

javax.servlet.http.HttpSession

 

javax.servlet.http.HttpSession

 

javax.servlet.http.HttpSession

세션은 클라이언트가 서버에 접속하는 순간 생성

  • 특별히 지정하지 않으면 세션의 유지 시간은 기본 값으로 30분 설정합니다.
  • 세션의 유지 시간이란 서버에 접속한 후 서버에 요청을 하지 않는 최대 시간입니다.
  • 30분 이상 서버에 전혀 반응을 보이지 않으면 세션이 자동으로 끊어집니다.
  • 이 세션 유지 시간은 web.xml파일에서 설정 가능합니다.
<session-config>
  <session-timeout>30</session-timeout>
</session-config>​