Servlet-(2) 쿠키와 세션
쿠키란?
쿠키는 서버가 클라이언트에 저장하는 정보로서, 클라이언트와 연결이 끊어져도 클라이언트에 저장된 정보가 유지되어 서버에 재 방문할 때 요청정보의 헤더 안에 포함되어 서버로 전달됩니다.
언제 사용하는가?
- 이전에 방문한 적이 있는 웹서버에 다시 방문했을 때 몇 번째 방문인지
- 비로그인자가 쇼핑몰에서 주문할 때까지 장바구니에 선택한 상품 정보들을 유지
- 포탈 사이트에서 클라이언트가 특별히 관심 있어하는 항목에 대한 정보 유지
- 자동 로그인을 허용할 때
쿠키 생성
쿠키를 생성하려면 javax.servlet.http.cookie 객체를 생성합니다.
Cookie c1 = new Cookie("쿠키이름","쿠키값");
쿠키 유효시간 설정은 setMaxAge( )를 사용하며 인자 값으로 초단위의 쿠키 유효시간을 지정한다
c1.setMaxAge(60*60*3);
서버의 특정경로 요청에서만 쿠키를 전송하고자 할때 setPath( ) 메소드를 사용합니다. setPath() 메소드의 인자값으로 지정하면, 지정된 경로와 그것의 하위 경로의 요청에 대해서만 클라이언트로부터 쿠키가 전송됩니다.
c1.setPatch("/");
쿠키는 기본적으로 전송된 서버에서만 읽어 들일 수 있지만 도메인을 설정하여 하나의 서버에서 클라이언트로 전송된 쿠키를 다른 서버에서 읽어 들일 수 있다.
// 정확히 일치하는 도메인
c1.setDomain("www.edu.com")
//서브 도메인 허용 "it.edu.com" 또는 "math.edu.com"
c1.setDomain(".edu.com")
생성된 쿠키를 클라이언트로 보내기 위해서 HttpServletResponse 객체의 addCookie( ) 메소드를 이용한다.
//addCookie( ) 메소드의 인자값에 전송할 Cookie 객체를 설정한다.
resp.addCookie(c1);
쿠키 추출
클라이언트로 전송된 쿠키를 서버쪽에서 읽어 들이려면 HttpServletRequest 객체의 getCookies() 메소드를 이용한다
Cookie[] list = req.getCookies();
쿠키의 이름을 추출할 때는 Cookie 객체의 getName( ) 메소드를 사용한다.
for(int i=0; list!=null && i < list.length; i++ )
{
out.println(list[i].getName() + "<br>");
}
쿠키의 값을 추출 할때는 Cookie 객체의 getValue( ) 메소드를 사용한다.
for(int i=0; list!=null && i < list.length; i++ )
{
out.println(list[i].getValue() + "<br>");
}
세션이란?
세션은 쿠키와 다르게 사용자의 정보가 서버에 저장된다. 세션을 클라이언트마다 개별적으로 유지하기 위해 HttpSession 객체가 생성될때 요청을 보내온 클라리언트 정보, 요청시간 정보 등을 조합한 세션ID가 부여되며, 이 세션ID가 쿠키 기술로 저장된다.
언제 사용하는가?
인증 또는 로그인 정보를 유지하거나 웹 애플리케이션 이용에 필요한 로그인한 사용자의 정보를 안전하게 서버에 보관할 때 사용된다. 그러나 세션ID가 클라이언트 측의 쿠키에 저장되므로 악의적인 해커가 XSS기법을 이용해 이 세션ID를 탈취(하이잭킹)하여 이 탈취한 세션ID를 이용해 나 아닌 해커가 해당 사이트에 부정하게 로그인하거나 권한을 획득할 수 있어 안전하다고는 할 수 없다.
이를 위한 보완 방법으로는 사용자 아이피와 사용환경을 체크하거나 세션의 유효기간을 설정하기도 한다.
세션 생성와 객체 삭제
세션 생성을 생성하기 위해서는 HttpServletRequest 객체의 getSession() 메소드를 이용한다. getSession( ) 메소드는 클라이언트가 가지고 있는 세션 ID와 동일한 세션 객체를 찾아서 주솟값을 반환한다.
HttpSession session = null;
session = req.getSession();
// isNew( ) 메소드는 getSession( )에서 반환 받은 세션객체가
// 새로 생성된 객체인지 기존의 세션 객체가 반환된 것인지 판단합니다.
if(session.isNew())
{
msg = "새로운 객체가 생성됨";
}else{
msg = "기존의 세션 객체가 리턴됨";
}
이와 다르게 오버로딩 메소드인 getSession(boolean create) 메소드는 세션을 생성할때 만일 세션이 존재하지 않으면, 매개변수 create 값이 true인지 false인지에 따라 다르게 동작합니다.
true일때, 세션 객체가 존재하지 않을 경우 새로운 HttpSession 객체를 생성하여 반환합니다.
session = req.getSession(true);
//세션 객체에 "msg"라는 이름의 세션 데이터를 얻어옵니다.
session.setAttribute("msg","메시지입니다.");
msg = "세션 객체에 데이터 등록 완료";
false일때, 세션 객체가 존재하지 않을 경우 새로운 HttpSession 객체를 생성하지 않고 null을 반환한다.
session = req.getSession(false);
if(session == null)
{
msg = "삭제할 세션 존재하지 않음";
}else{
// 세션객체의 invalidate( ) 메소드는 현재의 세션을 삭제한다.
session.invalidate()
msg = "세션 객체 삭제 작업 완료";
}
세션 데이터 추출와 삭제
session = req.getSession(false);
if(session == null)
{
msg = "데이터를 추가하거나 삭제할 세션 객체가 존재하지 않음";
}else{
// 세션에서 msg 이름의 데이터 추출
msg = session.getAttribute("msg");
// 세션에서 msg 이름의 데이터를 삭제
session.removeAttribute("msg");
}
쿠키와 세션의 차이점
저장 위치
쿠키는 클라이언트(브라우저)에 메모리 또는 파일에 저장하고, 세션은 서버 메모리에 저장된다.
보안
쿠키는 클라이언트 로컬(local)에 저장되기도 하고 특히 파일로 저장되는 경우 탈취, 변조될 위험이 있고, Request/Response에서 스나이핑 당할 위험이 있어 보안이 비교적 취약하다. 반대로 Session은 클라이언트 정보 자체는 서버에 저장되어 있으므로 비교적 안전하다.
라이프 사이클
쿠키는 앞서 설명한 지속 쿠키의 경우에 브라우저를 종료하더라도 저장되어 있을 수 있는 반면에 세션은 서버에서 만료시간/날짜를 정해서 지워버릴 수 있기도 하고 세션 쿠키에 세션 아이디를 정한 경우, 브라우저 종료시 세션아이디가 날아갈 수 있다.
속도
쿠키에 정보가 있기 때문에 쿠키에 정보가 있기 때문에 서버에 요청시 헤더를 바로 참조하면 되므로 속도에서 유리하지만, 세션은 제공받은 세션아이디(Key)를 이용해서 서버에서 다시 데이터를 참조해야하므로 속도가 비교적 느릴 수 있다.
시간
세션이 끝나는 유효시간이 default가 24분이라고 한다 (expire 셋팅을 안주는이유) 내가 브라우저를 오픈했는데 24분동안 유효하고 24분 후에는 세션이 만료 된다고 한다.
쿠키와 캐시의 차이점
쿠키
텍스트 파일에 대한 정보를 저장해놓는 곳이 쿠키이다. 쿠키는 서버에서 브라우저로, 브라우저에서 서버로 양방향으로 저장한다.
캐시
캐시는 css, 비디오, 이미지랑 자바스크립트를 저장한다 저장을 하고 다음번에 접속할때 빨리 화면에 뜨게 한다 캐시가 단방향으로 서버에서 브라우저로 저장한다.
댓글남기기