http는 Stateless 포로토콜이다. 클라이언트의 상태를 유지하지 않는 프로토콜이다. 그러나 서비스에서는 Stateful한 방식이 필요한 경우가 있다. 예를 들면 인터넷에서 쇼핑을 할 때 상품 선택의 통신이 끝난 후, 상품 구입의 리퀘스트가 서버로 보내지게 될 것인데, 만약 서버가 선택한 상품의 정보(상태)를 가지고 있지 않다면 클라이언트는 상품을 구매할 수 없게 된다. 이러한 Stateful을 가능하게 만드는 방법으로는 쿠키와 세션이 있다. 개념에 대해서 쉽게 설명한 강의가 있어서 먼저 소개하고자 한다.

https://www.youtube.com/watch?v=OpoVuwxGRDI

 

 

 

 

| 쿠키(cookie)

쿠키는 웹 브라우저가 보관하는 데이터이다. 웹 브라우저는 웹 서베에 요청을 보낼 때 쿠키를 함께 전송하며, 웹 서버는 웹브라우저가 전송한 쿠키를 사용해서 필요한 데이터를 읽을 수 있다. 쿠키는 웹 서버와 웹 브라우저 양쪽에서 생성할 수 있는데, JSP에서 생성하는 쿠키는 웹 서버에서 생성하는 쿠키이다.

 

01. 쿠키(cookie)의 동작 방식

1) 쿠키 생성 단계 : 최초 통신에서는 클라이언트가 서버의 쿠키를 가지고 있지 않는 상태에서 request한다. 그럼 웹 서버는 request 헤더에 쿠키가 포함되어 있지 않은 것을 판단하고, 웹 서버 측에서 통신의 상태(이름, 값, 유효시간, 도메인 , 경로)를 담아 쿠키를 생성한다. 생성한 쿠키를 response 데이터의 헤더에 저장해서 웹 브라우저에 전송한다.
2) 쿠키 저장 단계: 웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관한다. 쿠키의 종류에 따라 메모리나 파일에 저장한다.
3) 쿠키 전송 단계 : 웹 브라우저는 저장한 쿠키를 request가 있을 때마다 웹 서버에 전송한다. 웹 서버는 웹 브라우저가 전송한 쿠키를 사용해서 필요한 작업을 수행한다.

 

 

 

02. 쿠키 생성하기

response.addCookie() 메서드를 사용하면 response 기본 객체는 웹 브라우저에 쿠키 정보를 전송한다. Cookie 객체를 생성한 후에는 아래와 같은 메서드를 사용하여 쿠키의 특징을 변경하거나 읽어올 수 있다.

 

 

 

03. 쿠키 값 읽어오기

쿠키를 생성하면, 그 이후부터 해당 쿠키를 사용할 수 있다. 웹 브라우저는 요청 헤더에 쿠키를 저장해서 보내며, JSP 는 다음 코드를 사용해서 쿠키 값을 읽어올 수 있다.

request.getCookies()는 Cookie 배열을 리턴하며 읽어올 쿠키가 존재하지 않으면 null을 리턴한다.

 

 

 

04. 쿠키 값 변경 및 쿠키 삭제하기

쿠키 값을 변경하려면 같은 이름의 쿠키를 새로 생성해서 응답 데이터로 보내면 된다. 예를 들어, 이름이 "name"인 쿠키의 값을 변경하기 위해서는 다음과 같이 새로운 Cookie 객체를 생성해서 응답 데이터에 추가하면 된다.

쿠키를 삭제하려면 Cookie 클래스의 setMaxAge() 메서드를 호출할 때 인자 값으로 0을 주면 된다. Cookie 클래스는 쿠키를 삭제하는 기능을 별도로 제공해주지 않기 때문이다. (밑에 그림)

 

 

 

05. 쿠키의 도메인

기본적으로 쿠키는 그 쿠키를 생성한 서버에만 전송된다. 하지만 같은 도메인을 사용하는 모든 서버에 쿠키를 보내야 할 때가 있다. 이럴 때는 setDomain()메서드를 사용한다. setDomain()메서드는 생성한 쿠키를 전송할 수 잇는 도메인을 지정한다. 다음의 두 가지 형식으로 도메인을 지정할 수 있다.

[예]
.somehost.com : 점으로 시작하는 경우 관련 도메인에 모두 쿠키를 전송한다. 이와 같이 설정하면, mail.conehost.con, www.somehost.com, javacan.somehost.com에 모두 쿠키를 전송한다. 
www.somehost.con : 특정 도메인에 대해서만 쿠키를 전송한다. 
도메인을 지정할 때 주의할 점은 setDomian()의 값으로 현재 서버의 도메인 및 상위 도메인만 전달할 수 있다는 것이다.

 

 

 

06. 쿠키의 경로

경로는 쿠키를 공유할 기준 경로를 지정한다. 경로를 지정할 때에는 Cookie 클래스의 setPath() 메서드를 사용한다. 여기서 경로는 URL에서 도메인 이후의 부분에 해당한다.
setPath()메서드를 사용하여 쿠키의 경로를 지정하면, 웹 브라우저는 지정한 경로 또는 하위 경로에 대해서만 쿠키를 전송한다.

 

 

 

07. 쿠키와 헤더

response.addCookie()로 쿠키를 추가하면 실제로 Set-Cookie 헤더를 통해서 전달된다. 한 개의 Set-Cookie 헤더는 한 개의 쿠키 값을 전달한다. Set-Cookie 헤더의 구성은 다음과 같다.

 

 

 

 

 

| 세션(Session)

서버 세션을 사용하면 클라이언트의 상태를 저장할 수 있다. 쿠키와의 차이점세션웹 브라우저가 아니라 웹 서버의 메모리에 저장한다는 점이다. 즉 세션은 클라이언트와 서버의 통신 상태를 가진다. 세션을 이용한 다수의 HTTP 통신을 하나의 묶음으로 "세션관리"라고 말한다. 세션관리에서는 세션 ID와 세션을 하나의 짝으로 취급하는데, 이때 세션ID만이 클라이언트에 보내진다. 클라이언트에 세션 ID를 전해주는 방법은 여러 방법이 있으나 일반적으로 쿠키를 이용한다. 클라이언트로부터 세션 ID를 받아 실제로 서버의 세션에 저장된 중요한 정보들과 관련을 짓기 때문에 쿠키만을 이용한 방식보다 보안적인 측면에서 좋다.

그리고 웹 컨테이너는 기본적으로 한 웹 브라우저마다 한 세션을 생성한다. 즉, 같은 JSP 페이지라도 웹 브라우저에 따라 서로 다른 세션을 활용한다는 것이다.

 

 

01. 세션 생성하기

JSP에서 세션을 생성하려면 page 디렉티브의 session 속성을 "true"로 지정하면된다.

그런데 기본값이 true이므로 굳이 작성하지 않아도 되지만, session을 생성하고 싶지 않다면 false로 반드시 지정해주어야 한다.

 

 

02. session 기본 객체

세션을 사용한다는 것은 session 기본 객체를 사용한다는 것을 말한다. session 기본 객체역시 속성을 제공하므로 setAttribute(), getAttribute() 등의 메서드를 사용하여 속성값을 저장하거나 읽어올 수 있다.

앞에서 웹 브라우저마다 별도의 세션을 갖는다고 했다. 이때 각 세션을 구분하기 위해 세션마다 고유 ID를 할당하는데 그 아이디를 세션 ID라고 한다. 웹 서버는 웹 브라우저에 세션 ID를 전송한다. 웹 브라우저는 웹 서베에 연결할 때마다 매번 세션 ID를 보내서 웹 서버가 어떤 세션을 사용할지 판단할 수 있게 한다.

 

 

 

03. 세선 종료

세션을 유지할 필요가 없으면 session.invalidate() 메서드를 사용해서 세션을 종료한다. 세션을 종료하면 현재 사용 중인 session 기본 객체를 삭제하고 session 기본 객체에 저장했던 속성 목록도 함께 삭제한다.

 

 

 

04. request.getSession()을 이용한 세션 생성

HttpSession을 생성하는 또 다른 방법은 request 기본 객체인 getSession() 메서드를 사용하는 것이다. request.getSession()메서드는 현재 요청과 관련된 session 객체를 리턴한다. 아래 코드는 사용 예이다.

request.getSession()메서는 session이 존재하면 해당 session을 리턴하고 존재하지 않으면 새롭게 session을 생성해서 리턴한다. session이 새성된 경우에만 session 객체를 구하고 싶다면, getSession()메서드에 false를 인자로 전달하면 된다. request.getSession(false)를 실행하면 세션이 존재하는 경우에만 session 객체를 리턴하고 세션이 존재하지 않으면 null을 리턴한다.