쿠키와 세션에 대해 알아보기 전에 이 두가지를 왜 사용하는 것인가?
쉽게 말하면 쿠키와 세션은 한번 로그인을 하면 어떠한 방식에 의해서 그 사용자에 대한 인증을 유지하게 해주는 것이다.
웹브라우저에서 서버로 어떤 데이터를 요청하면, 서버측에선 알맞은 로직을 수행한 후 데이터를 웹브라우저로 응답한다. 그리고 서버는 웹 브라우저와의 관계를 종료한다. 웹브라우저에 응답 후 관계를 끊는 것은 HTTP프로토콜의 특징이다.
연결이 끊겼을 떄 어떤 정보를 지속적으로 유지하기 위한 수단으로 쿠키라는 방식을 사용한다.
쿠키는 서버에서 생성하여 서버가 아닌 클라이언트속에 특정 정보를 저장한다.
그리고 서버에 요청할 때 마다 쿠키의 속성값을 참조 또는 변경할 수 있다.
--> 쿠키란 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일(.txt형식)을 일컫는다.
--> 예시) 사용자가 로그인을 한번 하고나면 다음에 로그인 할 때 계정 정보가 자동입력되는 경우
쇼핑몰의 장바구니 기능
팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크기능
생성 과정
쿠키클래스를 이용하여 쿠키를 생성 -> 속성 설정(ex: id="wonseob", pw="asd" ..) -> response객체에 쿠키 탑재
<body>
<%
//쿠키 클래스 생성 -> 속성 설정 -> 쿠키 탑재
Cookie cookie = new Cookie("cookieN", "cookieV"); //name과 value(둘 다 String)
cookie.setMaxAge(60*60); //60초 * 60초 = 1시간
response.addCookie(cookie); //response 객체를 이용해 쿠키 탑재
%>
<a href="CookieGet.jsp">쿠키 얻으러 가자</a>
</body>
<body>
<%
Cookie[] cookies = request.getCookies(); //request로 쿠키를 받음
for(int i=0; i<cookies.length; i++)
{
String str = cookies[i].getName(); //쿠키의 이름을 받는다.
if(str.equals("cookieN"))
{ //출력해주는 것
out.println("cookies[" +i+ "] name : "+ cookies[i].getName()+"<br/>"); //쿠키의 이름
out.println("cookies[" +i+ "] value : "+ cookies[i].getValue()+"<br/>"); //쿠키의 값
out.println("===================<br/>");
}
}
%>
<a href="CookieDel.jsp">쿠키 지우러 가자</a>
</body>
<body>
<%
Cookie[] cookies = request.getCookies();//request로 쿠키를 받음
for(int i=0; i<cookies.length; i++)
{
String str = cookies[i].getName();
if(str.equals("cookieN"))
{
out.println("name : "+cookies[i].getName() + "<br/>");
cookies[i].setMaxAge(0); //쿠키의 유효기간을 0으로 만들기 -> 삭제
response.addCookie(cookies[i]); //response에 탑재를 꼭 해줘야함
}
}
%>
<a href="CookieTest.jsp">쿠키 확인하기</a>
</body>
<body>
<%
Cookie[] cookies = request.getCookies(); //request로 받고
if(cookies != null) //null이 아니면
{
for(int i=0; i<cookies.length; i++) //모든 쿠키 출력
{
out.println(cookies[i].getName()+"<br/>");
out.println(cookies[i].getValue()+"<br/>");
} //cookieN에 대한 정보가 다 사라져있어야 함
}
%>
</body>
생성 과정
Session은 JSP컨테이너에서 자동으로 생성해줌
세션 관련 메소드
<body>
<%
//세션 속성 생성 쿠키와 다르게 데이터의 자료형이 Object형이다.
session.setAttribute("MySessionName", "mySessionData"); //세션1
session.setAttribute("myNum", 12345); //세션2
%>
<a href="SessionGet.jsp">세션 얻으러 가자</a>
</body>
<body>
<%
Object obj1 = session.getAttribute("MySessionName"); //mySessionName이라는 세션의 정보를 받는다.
String MySessionName = (String)obj1;
out.println(MySessionName + "<br/>");
Object obj2 = session.getAttribute("myNum"); //myNum이라는 세션의 정보를 받는다.
int myNum = (Integer)obj2;
out.println(myNum + "<br/>");
out.println("**************************<br/>");
String sName;
String sValue;
//Enumeration은 인터페이스다. 객체들의 집합(Vector)에서 객체들을
//한순간에 하나씩 처리할 수 있는 메소드를 제공하는 컬렉션이다.
Enumeration enumeration = session.getAttributeNames(); //모든 session 얻기
while(enumeration.hasMoreElements()){ //데이터가 있다면
sName = enumeration.nextElement().toString(); //세션 이름담기
sValue = session.getAttribute(sName).toString();//해당되는 세션 이름의 값을 담는다.
out.println("sName : "+sName+"<br/>");
out.println("sValue : "+sValue+"<br/>");
}
out.println("**************************<br/>");
String sessionID = session.getId(); //컨테이너가 자동으로 생성해주는 id 가져오기
out.println("sessionID : "+sessionID + "<br/>");
int sessionInter = session.getMaxInactiveInterval(); //유효시간, 초단위로 출력됨.
out.println("sessionInter : "+sessionInter + "<br/>");
out.println("**************************<br/>");
session.removeAttribute("MySessionName"); //세션1 데이터 삭제
Enumeration enumeration1 = session.getAttributeNames();
while(enumeration1.hasMoreElements())
{
sName = enumeration1.nextElement().toString();
sValue = session.getAttribute(sName).toString();
out.println("sName : "+sName+"<br/>");
out.println("sValue : "+sValue+"<br/>");
}
out.println("**************************<br/>");
session.invalidate(); //세션의 모든 데이터 삭제
if(request.isRequestedSessionIdValid()) //유효한 세션이 있는지 체크
{
out.println("session valid"); //있으면 출력
}
else
{
out.println("session invalid"); //없으면 출력
}
%>
</body>
세션은 서버의 자원을 사용하기 때문에 무분별하게 생성되면 서버의 메모리가 감당할 수 없어지고 그러면 속도가 느려지기 때문이다.