본문 바로가기

프로그래밍/JAVA, Servlet, JSP

Cookie, Session 정의

//세션Tracking

정의 :

-웹페이지들간의 클라이언트 상태유지를 위해 사용되는 기술

-서로 관련이 없던 페이지들간에 연관성을 설정하는 방법

등장배경 :

HTTP 프로토콜은 클라이언트와 서버간 요청과 응답이 실행되면 연결이 종료된다. 이것은 전 페이지에서 수행했던 작업을 다른 페이지에서 인식할수 없음을 의미한다. 전페이지에서 수행했던 작업을 다른 페이지에서도 인식할수 있게 구현해야 함.

용도 : 로그인, 장바구니

구현방법 : hidden태그, Get방식을 이용한 URL파라미터, 쿠키, 세션

 

예제1) hidden태그를 이용(HTML hidden태그이용, 브라우저에서는 보이지 않는다.)

<form method=’get’ action=’login’>

 <input type=’hidden’ name =’address’ value=’서울’>

 <input type =’hidden name = ‘email’ value = ‘daecheol1983@naver.com’>

 <input type =’text’ name = ‘id’>

 <input type = ‘password’ name = ‘pw’>

 <input type =’submit’  value=’gogo’>

</form>

 

-LoginForm Class

 String address = request.getParameter(“address”);

 String email = request.getParameter(“email”);

예제2)get방식을 이용 URL 쿼리스트링

-LoginForm Class 에 추가

Out.println(“< a href=/webapp/login2?id=”+id+”&pw=”+pw”>LoginForm2로 보내기</a>”);

...

 

//쿠키이용

정의 :

-웹사이트의 방문기록을 클라이언트에 저장하여 사용자와 웹사이트 사이를 매개해 주는 정보

특징 :

-정보가 클라이언트에 저장, 용량제한(도메인당 20, 300, 4kb), 보안취약

-클라이언트에 의해 사용유무 결정, 도메인당 쿠키가 생성

용도 :

-사이트의 고객 맞춤 정보 제공, 로그인시 ‘id저장’, 팝업창 오늘은 더 이상 열지 않기 등

 

종류 :

 

-Persistance쿠키

-Session쿠키

저장위치

파일로 저장

브라우저의 메모리

만료시기

사용자가 쿠키삭제 or 설정값 만료

브라우저 종료시

초기접속시 전송여부

초기접속시 전송

전송X

용도

사이트 재 접속시 속성값저장(아이디, 팝업제한)

사이트 접속시 인증정보 유지

C:\Documents and Settings\Administrator\Cookies 안에 저장

 

/Cookie Architecture

1.     브라우저로 특정 도메인 요청

2.     서버는 접속한 클라이언트 정보를 저장한 쿠키 생성

3.     쿠키를 가지고 클라이언트에 응답

4.     쿠키를 클라이언트에 저장

5.     도메인에 재요청시 저장된 쿠키를 서버에 넘겨줌

6.     서버는 클라이언트에서 넘겨준 쿠키 정보를 이용 동일 클라이언트 판별

 

/쿠키이용

-javax.servlet.http.Cookei이용

-HttpServletResponse addCookie()로 클라이언트에 저장

-HttpServletRequest getCookies()로 얻어옴 반환형은 배열(도메인당 20)

 

/Cookie메소드 : getValue(), setMaxAge()…

 

/setMaxAge() :

인자값으로 음수를 지정하거나setMaxAge메소드를 사용하지 않으면 Session쿠키로 저장,

양수값을 지정하면 Persistence쿠키로 저장되며 지정값 만큼만 쿠키 유효

 

예제3)

-SetCooketTest Class

Enumeration enu = request.getHeaderNames();

While(enu.hasMoreElements()){

 String key = (String)enu.nextElement();

 Sout(key + “ “ + request.getHeader(key));

}

Date d = new Date();   //현재시간 구하기

Cookie c = new Cookie(“cookieTest”, d.toString());

c.setMaxAge(24*60*60);   //24시간

response.addCookie(c);

out.print(“현재시간”+ d +” Cookie에 저장합니다.”) ;

 

-GetCookieTest Class

Cookie[] allValues = request.getCookies();

For(int i = 0; I < allValues.length ; I ++ ){

 If(allValues[i].getName().equals(“cookieTest”)){

Out.println(“Cookie“ + allValues[i].getValue() + “저장된 Cookie값을 가져왔습니다.”);

 }

}

 

예제4) setMaxAge(-1)로 해서 실행

 

//세션이용

정의 : 웹사이트의 방문기록을 서버에 저장하여 사용자와 웹사이트 사이를 매개해주는 정보

특징 :

-정보가 서버에 저장, 세션구현은 쿠키이용, 보안유리, 서버에 부담이 될수 있다.

-브라우저 당 유일한 세션(세션ID)이 하나씩 생긴다.

-서버에 저장된 정보는 유효시간을 갖는다.(기본 30(1800)동안 유효)

 

/session Architecture

1.     브라우저로 특정도메인에 요청한다

2.     서버는 접속한 브라우저에 대한 세션ID를 생성하고 세션ID값을 저장한다.

3.     세션ID를 가지고 클라이언트에 응답한다.

4.     세션ID를 브라우저에 저장한다.(세션ID도 결국 쿠키, 이름은 jsessionid)

5.     도메인에 재요청시 저장된 세션ID를 서버에 넘겨준다.

6.     서버는 클라이언트에서 넘겨준 세션id를 이용 동일한 클라이언트인지 체크

 

/세션이용

-사용방법 : javax.servlet.http.HttpSession이용

-생성과사용 : 세션생성과 생성된 세션을 사용하는 메소드가 동일, getSession메소드 이용

-getSession() : 세션이 있으면 리턴, 없으면 새로 생성

-getSession(true) : 세션이 있으면리턴, 없으면 새로 생성해서 리턴

-getSession(false) : 세션이 있으면 리턴, 없으면 null리턴

 

/HttpSession메소드

setMaxInactiveInterval() 세션 유효시간 지정 단위 초

setAttribute() 바인딩 저장, getId() 세션ID얻기,

getLastAccessdTime()  마지막 접근시간, isNew() 생성된것인지 만든것인지 판별 등

invalidate() 세션삭제(로그아웃)

 

예제 5) 세션

-SessionTest Class

HttpSession session = request.getSession();

Out.println(“sessionID : “ + session.getId());

Out.println(“Creation Tiem : “ + new Date(session.getCreationTime()));

Out.println(“Last Accessed Time : “ + new Date(session.getLastAccessedTime()));

Out.println(“Max Inactive Interval : “ + session.getMaxInactiveInterval());

If(session.isNew()){

 Out.print(“NEW”);

}

 

A)3개의 브라우저를 열어서 동일한 주소로 확인해보면 sessionID는 다다르고

생성시간도 조금씩 차이, 유효시간 기본 1800, NEW표시

그후 3개 모두 새로고침 하면 sessionID 동일(30분 안지났으므로)

 

/세션 소멸

-web.xml에서 세션 유효시간 설정(기본 30)

 C:\Tomcat \conf\web.xml 열어보면 321line

 <session-config>

<session-timeout>30</session-timeout>

 </session-config>

-invalidate() 세션 삭제

 Session.invalidate();  <-바로 세션 삭제

-setMaxInactiveInterval() 유효시간 설정

 Session.setMaxInactiveInterval(30) 으로 변경하면 30초후 세션 삭제(30초후refresh 하면 id변경)

 

예제6 ) session 바인딩

-SessionTest Class

HttpSession session = request.getSession();

If(session.isNew()){

Out.print(“로그인하세요”);

Out.print(“<a href = ‘자신페이지’>로그인</a>”);

Session.setAttribute(“login.name”, “강대철”);

}else{

 String name = (String)session.getAttribute(“login.name”);

 Out.print(“하휘”+ name + “”);

}

 

/쿠키제한의 문제점 : 세션처리도 쿠키를 이용, 쿠키사용 제한하면 세션처리 불가능

-URL Rewriting 방법이용 해결

Response.encodeURI() 이용 : 이것은 인위적으로 jsessionid값을 생성하여 서버에 전달

 

 

예제 7) URL Rewriting

-SessionTest Class

HttpSession session = request.getSession();

If(session.isNew()){

 Out.print(“로그인하세요”);

 String url = response.encodeURL(“sess”);    //sess url-pattern

 Out.print(“<a href=”+url+”>로그인</a>

 Session.setAttribute(“login.name”,”강대철”);

}else{

String name = (String)session.getAttribute(“login.name”);

Out.println(“안녕”+ name+ “ !”);
}

 

 

예제 8 ) 로그인 실습예제

-Index.html

<html>

 <body>

<h3>로그인정보를 입력하세요

<form action=”login” method =”Get”>

이름 : <input type = “text” name = “name” ></p>

아이디 : <input type = “text” name = “id” > </p>

비밀번호 : <input type = “password” name = “pass” ></p>

<input type = “submit” value=”전송” >

</form>

</body>

 

-web.xml

<web-app>

 <servlet>

 <servlet-name>Login</servlet-name>

 <servlet-class>test.web.LoginSession</servlet-class>

</servlet>

<servlet>

 <servlet-name>Show</servlet-name>

<servlet-class>test.web.ShowLogin</servlet-class>

</servlet>

<servlet-mapping>

 <servlet-name>Login</servlet-name>

 <url-pattern>/login</url-pattern>

</servlet-mapping>

<servlet-mapping>

 <servlet-name>Show</servlet-name>

 <url-pattern>/show</url-pattern>

</servlet-mapping>

</web-app>

 

-LoginSession class

Public class LoginSession extends HttpServlet{

 Public void doGet(HttpServletRequest request, HttpServletResponse response){

Response.setContentType(“text/html; charset=euc-kr”);

PrintWriter out = response.getWriter();

Request.setChracterEncoding(“EUC-KR”);

String name = request.getParameter(“name”);

String id = request.getParameter(“id”);

String pass = request.getParameter(“pass”);

 

HttpSession session = request.getSession();

If(session.isNew()){

  Session.setAttribute(“login.name”, name);

Session.setAttribute(“login.id”, id);

Session.setAttribute(“login.pass”, pass);

}

Out.print(“<html><body>안녕”);

Out.print(name+””);

Out.print(“<a href = show>회원정보보기</a>”);

  Out.print(“</body></html>”);

 }

}

 

 

-ShowLogin Class

Public class ShowLogin extends HttpServlet{

 Public void doGet(HttpServletRequest request, HttpServletResponse response){

 Response.setContentType(“text/html; charset = euc-kr”);

 PrintWriter out = response.getWriter();

 String name = “”;

 String id = “”;

 String pass = “”;

 HttpSession session = request.getSession(false);

 If(session != null){

Name = (String)session.getAttribute(“login.name”);

Id = (String)session.getAttribute(“login.id”);

Pass = (String)session.getAttribute(“login.pass”);

 }else{

  Response.sendRedirect(“loginSession.html”);

 }

Out.print(“<html><body>”);

Out.print(“이름 : “ + name);

Out.print(“아이디 : “ +id);

Out.print(“비밀번호 : “ + pass);

Out.print(“</body></html>);

}|

 

}

출처 : http://daecheol.tistory.com/73

'프로그래밍 > JAVA, Servlet, JSP' 카테고리의 다른 글

플래쉬 파일업로드 테스트  (0) 2009.11.14
Cookie, Session <유용한 소스>  (0) 2009.10.16
자바에서 이미지 리사이징  (0) 2009.10.14
java용 날짜 구하기 팁  (0) 2009.10.14
패키지에 대한 정의  (0) 2009.10.14