JSP/JSP 정리

[JSP] 쿠키(Cookie)와 세션(session)

h0-0cat 2023. 6. 4. 10:59
728x90

 

쿠키(cookie)

우리가 일상적으로 사용하는 인터넷 서비스에서는 연결(connection)이 지속됩니다.
연결이 지속된다는 말은, 예를 들어 온라인 쇼핑몰에서 찜해 놓은 상품 목록을 다른 웹사이트를 방문했다 돌아와도 여전히 확인할 수 있다는 것을 의미입니다.
이렇듯 인터넷 서비스는 연결이 지속되어야 사용자들이 편리하게 웹사이트를 사용할 수 있습니다.
인터넷에서 사용 가능한 웹 서비스로는 ftp, http 등이 있습니다.
이들 서비스는 일종한 규칙을 준수해야 하는데 이를 프로토콜(표준 인터넷 규약)이라고 합니다.
서버가 쿠키를 클라이언트에 저장해 두면 쿠키에 대한 정보를 필요로 하는 웹 페이지가 웹 서버에 요청될 때 저장해 놓은 쿠키에 대한 정보를 웹 서버에 다시 건네줍니다. 쿠키는 사용자측에 대한 정보를 보관해 두었다가 웹 서버의 요청에 의해 그 정보를 원하는 순간 사용할 수 있게 합니다.
쿠키는 클라이언트에 저장된 적은 양의 정보입니다.
크기는 4KB 이하로 제한되어 있고 300개까지의 데이터 정보 배열을 저장할 수 있습니다.
쿠키를 사용할 수 있는 최대 용량은 4KB * 300= 1.2MB가 됩니다.
쿠키의 크기는 4KB로 이하로 제한되어 있으므로 작은 정보 형태로 저장되고 오래된 정보는 자동으로 삭제됩니다.
참고로 이미지 정보는 대부분 용량이 크기 때문에 경로만 저장합니다.

쿠키를 이용하기 위해서는 response 객체를 사용해서 쿠키 정보를 클라이언트에 저장해두었다가 이를 request 객체를 사용하여 가져옵니다.
우선 쿠키의 정보를 클라이언트에 저장하는 방법부터 살펴봅시다.
서버가 클라이언트에 쿠키를 설정하기 위해서는 다음과 같은 단계를 거칩니다.
① 쿠키 객체를 생성합니다.
쿠키에 속성 값을 설정해 줍니다.
③ response 객체의 addCookie() 메소드를 호출하여 쿠키를 추가합니다.

 

번째 인자에는 쿠키의 이름을 지정하고 두 번째 인자에는 쿠키의 값을 설정합니다.
<!--긁지않은 개발자-->
Cookie(name, value)

 

간단한 메시지(I am First Cookie!)testCookie란 이름으로 쿠키에 저장해 두기 위해서 쿠키 객체를 생성하는 예입니다.
<!--긁지않은 개발자-->
Cookie info = new Cookie("testCookie","I am First Cookie!");
Cookie 객체가 생성되었으면 쿠키 관련 메소드들을 사용할 수 있습니다.
쿠키 객체가 info로 선언되었으므로 info.쿠키관련메서드()를 호출하면 됩니다.
쿠키 관련 메소드는 크게 두 가지로 나뉩니다. 쿠키에 새로운 값을 설정하는 set으로 시작하는 메소드와 쿠키에 설정된 값을 알아내는 목적으로 사용하는 get으로 시작하는 메소드로 나뉩니다

 

메소드 설명
void setComment(String) 쿠키에 대한 설명을 설정합니다.
void setDomain(String) 쿠키의 유효한 도메인을 설정합니다.
void setMaxAge(int) 쿠키의 유효한 기간을 설정합니다.
void setPath(String) 쿠키의 유효한 디렉토리를 설정합니다.
void setSecure(boolean) 쿠키의 보안을 설정합니다.
긁지않은개발자 (JSP에서 쿠키를 사용하는 데 자주 사용되는 메소드들을 정리한 표)

 

메소드 설명
void setValue(String) 쿠키의 값을 설정합니다.
void setVersion(int) 쿠키의 버전을 설정합니다.
String getComment() 쿠키에 대한 설명을 알려줍니다.
String getDomain() 쿠키의 유효한 도메인 정보를 알려줍니다.
int getMaxAge() 쿠키의 사용할 수 있는 기간에 대한 정보를 알려줍니다.
String getName() 쿠키의 이름을 알려줍니다.
String getPath() 쿠키의 유효한 디렉토리 정보를 알려줍니다.
boolean getSecure() 쿠키의 보안이 어떻게 설정되어 있는지를 알려줍니다.
String getValue() 쿠키에 설정된 값을 알려줍니다.
int getVersion() 쿠키의 버전을 알려줍니다.
긁지않은개발자

쿠키 정보가 1년 동안 유효할 수 있도록 이미 생성된 쿠키 객체(info)에 유효기간을 결정하는 메소드인 setMaxAge()를 사용해봅시다

<!--긁지않은 개발자-->

info.setMaxAge(365*24*60*60); //365일

 

setMaxAge()에는 초 단위로 시간을 설정해야 합니다. 1년을 초 단위로 환산한 “365*24*60*60”setMaxAge()의 인자로 주어 쿠키 객체(info)에 저장된 정보가 1년 동안 유효할 수 있도록 하였습니다.
이렇게 생성한 쿠키 객체의 정보는 클라이언트 측에 보내서 저장해 두어야만 나중에 다시 사용할 수 있게 됩니다.
그러기 위해서는 response 객체에 쿠키 객체를 추가하면 됩니다.
<!--긁지않은 개발자-->
response.addCookie(info);
request 객체의 getCookies() 메소드를 사용하면 클라이언트에 설정된 모든 쿠키 객체들을 얻어올 수 있습니다.

클라이언트에 설정된 쿠키가 여러 개라면 이를 다 제어할 수 할 수 있어야 하므로 getCookies 메소드의 리턴값은 배열 형태입니다.

 

<!--긁지않은 개발자-->
Cookie[] cookies = request.getCookies();

 

 
request 객체의 getCookies()로 얻어온 쿠키들을 Cookie 클래스의 배열인 cookies에 저장합니다.
배열에 저장된 모든 쿠키의 정보를 알아내기 위해서 아래와 같이 for문을 이용합니다.  
<!--긁지않은 개발자-->
for (Cookie c : cookies) { 
   out.println(c.getName()+" : +c.getValue()+"<br>");
}
쿠키의 이름을 알아내기 위해서는 getName(), 쿠키에 설정된 값을 알아내기 위해서는 getValue()를 사용합니다. geValue()는 쿠키에 설정된 값을 문자열 형태로 알려줍니다.
 
 
특정 쿠키를 더 이상 사용하지 못하게 하려면 쿠키의 유효기간을 만료시켜야 합니다. 쿠키를 사용할 수 있는 유효기간을 결정하는 메소드인 setMaxAge()에 유효기간을 0으로 설정하면 만료됩니다.
<!--긁지않은 개발자-->
Cookie cookie = new Cookie("id", "");
cookie.setMaxAge(0); // 쿠키의 유효기간을 만료시킴
response.addCookie(cookie);
<!--긁지않은 개발자-->

JSESSIONID
아직 세션을 배우지는 않았지만 쿠키의 정보 중 JSESSIONID에 대해서 의문을 가질 분들이 있을 것입니다. 
세션 기술에서는 웹브라우저로 세션 ID를 보낼 때 쿠키 형태로 만들어서 전송하는데, 
JSESSIONID가 바로 세션 정보를 저장한 쿠키의 이름입니다.

 


 

세션(session)

쿠키를 설명할 때 (다른 페이지로 이동하더라도 그 전 페이지의 정보가 유지되어야 하는) 상태유지를 위한 특별한 기법이 필요하다는 설명을 하였습니다.
상태 유지의 한 방법인 쿠키는 클라이언트의 하드웨어를 이용하여 정보를 저장하여 하드웨어에 저장해 두었던 정보를 가져와 페이지가 이동되더라도 상태가 유지되도록 합니다.
하지만 이 방법은 쿠키가 저장되는 디렉토리만 뒤지면 얼마든지 정보를 알아낼 수 있으므로 PC 방과 같이 여러 사람이 PC를 공유하는 경우에는 개인의 정보가 유출될 수 있다는 우려가 있어 보안 유지가 되지 않는다는 단점이 있습니다.
또한 저장할 수 있는 데이터도 1.2MB로 한계가 있습니다.
이러한 단점을 극복하기 위해서 나온 상태 유지 방법 중의 하나가 세션입니다.
 
 
세션은 다음과 같은 장점이 있습니다.

* JSP(서버)에서만 접근 가능하므로 보안 유지에 강력합니다.

* 저장할 수 있는 데이터에 한계가 없습니다.

세션은 서버 상에 존재하는 객체로서 브라우저 단위당 한 개씩 존재하게 됩니다. 세션은 웹 브라우저를 닫기 전까지 페이지를 이동하더라도 사용자의 정보를 잃지 않고 서버에 보관할 수 있도록 하는 객체입니다.
 
JSP는 세션의 상태 관리를 위한 내장 객체 session을 제공합니다.
다음은 session에서 자주 사용되는 메소드를 정리한 표입니다.
 
메소드 설명
Object getAttribute(
String name)
이름에 해당되는 객체 값을 가져옵니다. 없을 경우에는 null을 반환합니다. 반환값은 Object형이므로 반드시 형 변환을 하여 사용해야 합니다.
Enumeration
getAttributeNames()
세션에서 모든 객체들의 이름을 Enumeration 형으로 얻어 줍니다.
long getCreationTime( ) 세션이 만들어진 시간을 반환합니다.
String getId() 해당 세션을 가리키는 고유 id값을 String 형으로 변환합니다.
long getLastAccessedTime() 해당 세션이 클라이언트가 마지막으로 request를 보낸 시간을 long형으로 반환합니다.
  긁지않은개발자
 
메소드 설명
int getMaxInactiveInterval() 사용자가 다음 요청을 보낼 때까지 세션을 유지하는 최대 시간(초 단위)로 되돌려줍니다.
boolean isNew() 해당 세션이 처음 생성되었으면 true값을 반환하고 이전에 생성이 된 세션이라면 false를 반환합니다.
void removeAttribute(
String name)
지정된 이름에 해당하는 객체를 세션에서 제거합니다.
void setAttribute(
String name, Object value)
세션에 지정된 이름에 객체를 추가합니다.
void setMaxInactiveInterval(
int interval)
사용자가 다음 요청을 보낼 때까지 세션 유지하는 최대 시간(초 단위)을 설정합니다. 이 시간을 넘기면 서블릿 엔진은 세션을 종료합니다.
void invalidate( ) 해당 세션을 없애고 세션에 속해있는 값들을 없앱니다.
  긁지않은개발자

 

상태유지를 위해서는 세션에 값을 저장한 후 이를 가져와서 사용합니다.
이를 위해서는 세션에 값을 저장하는 setAttribute()와 세션에 저장된 값을 얻기 위한 getAttribute()가 사용됩니다.
 
다음은 setAttribute()의 기본 형식입니다.
<!--긁지않은 개발자-->
session.setAttribute(String name, Object value);
setAttribute()로 세션에 값을 지정할 때 원하는 값을 찾아오기 위해서 이름을 지정해 주어야 하는데, setAttribute()의 기본 형식에서 볼 수 있듯이 저장한 값을 식별하기 위한 이름은 String 형이어야 합니다.
세션에 저장하는 값은 Object 형이므로 어떠한 자료 형태라도 저장할 수 있습니다.
 
다음은 세션에 "pinksung"이란 문자열 값을 "id"이란 이름으로 저장하는 예입니다.
<!--긁지않은 개발자-->
session.setAttribute("id", "pinksung");

 

세션에 저장된 값을 얻어오기 위해서는 gettAttribute()를 사용합니다.
<!--긁지않은 개발자-->
Object getAttribute(String name)
세션에 값을 저장하면서 setAttribute()의 첫 번째 인자로 준 namegettAttribute()의 인자로 주면 이름에 해당되는 값을 찾아서 Object 형으로 되돌려줍니다. 찾지 못할 경우에는 null 값을 되돌려줍니다.
 
다음은 “id”에 설정된 문자열 값을 찾아오는 예제입니다.
<!--긁지않은 개발자-->
String id = (String) session.getAttribute("id");
찾은 값은 Object 형이기 때문에 반드시 적절한 형 변환을 해야 합니다. “id”에 설정된 값은 String 형이므로 cast 연산자로 형 변환했습니다. 이번에는 정수 값을 얻어와 봅시다.
<!--긁지않은 개발자-->
Integer age = (Integer) session.getAttribute("age");
이번에는 세션에 저장된 모든 값을 얻어오도록 합시다.
우선 getAttributeNames() 메소드로 세션에서 이름을 java.util.Enumeration 형으로 얻어옵니다.
Enumeration 형은 여러 개의 데이터를 집합처럼 관리하는 인터페이스입니다.
Enumeration에서 여러 데이터를 뽑아오기 위해서는 hasMoreElements()nextElement() 메소드를 적절하게 하게 사용해야 합니다.
메소드 설명
boolean hasMoreElements() Enumeration 객체에 뽑아올 데이터가 있는지를 검사하여 있다면 true, 더 이상 데이터가 존재하지 않는다면 false를 리턴합니다.
E nextElement() 다음 아이템이 존재한다는 전제하에서 아이템을 하나씩 뽑아오는 역할을 합니다.
  긁지않은개발자
 
Enumeration 객체로 세션에 저장된 모든 값들을 얻어오기 위한 방법은 다음과 같습니다.
<!--긁지않은 개발자-->
Enumeration names = session.getAttributeNames(); ...............①
while(names.hasMoreElements()){ ...................................②
String name=names.nextElement().toString() ; ......................③
String value=session.getAttribute(name).toString( );....................④
out.println(name + " : " + value + "<br>");

세션 제거하기

로그인되어 있는 상태에서 브라우저를 닫지 않고 자리를 비운다면 그 사이에 개인 정보가 유출될 수 있습니다.
그래서 로그아웃 후에 자리를 비워야 합니다.
로그아웃 처리과정에서 세션이 설정되어야만 사용 가능한 회원 전용 페이지에는 접근하지 못하도록 하기 위해서 세션에 저장된 어트리뷰트 값을 제거해야 합니다
이렇게 세션에 저장된 특정 어트리뷰트 값을 제고하기 위해서 사용하는 메소드가 removeAttribute() 메소드입니다.

세션에는 여러 키들을 지정하여 값들을 저장할 수 있습니다.

저장된 값들이 유지되면 이전의 정보를 다른 웹 페이지에서도 가져다 쓸 수 있습니다.
이러한 세션의 유효 시간은 기본적으로 30분으로 잡혀있습니다.
하지만 세션이 더 이상 사용되지 않는다면 세션 정보도 더 이상 필요하지 않았습니다.
때 설정된 세션의 값들을 모두 사라지도록 하려면 세션 객체의 invalidate()를 사용합니다.
invalidate()는 해당 세션을 없애고 세션에 속해있는 값들을 모두 없앱니다.
 
 
 

728x90

'JSP > JSP 정리' 카테고리의 다른 글

[JSP] JSP EL 표현식과 문법 사용법  (0) 2023.06.05
[JSP] JSP 자바 빈과 액션 태그  (0) 2023.06.04
[JSP] 서블릿(Servlet)이란?  (0) 2023.06.02
[JSP] JSP 액션태그  (0) 2023.06.01
[JSP] JSP 내장객체  (0) 2023.06.01