본문 바로가기
JSP, Servlet/Summary

JSP/Servlet : 쿠키, 세션 (Cookie, Session)

by autumnly 2017. 1. 8.

쿠키란?


http프로토콜에서

웹 브라우저가 서버로 요청을 하면, 서버는 알맞은 동작을 한 후 웹브라우저에 응답하고 연결을 종료한다.

이처럼 연결이 끊겼을 때 정보들을 지속적으로 유지하기 위한 수단으로 쿠키를 사용한다.

쿠키는 서버에서 생성하고 클라이언트측에 저장된다.

서버에 요청할 때마다 쿠키의 속성값이 변경, 참조될 수 있다.


쿠키는 로컬에 txt파일 형태로 저장되기 때문에

보안에 취약하다는 단점이 있다. 따라서 최근 웹브라우저들은 쿠키생성을 차단하기도 한다.


쿠키 관련 메소드

  • setMAxAge() : 쿠키의 유효기간 설정
  • setpath() : 쿠키사용의 유효 디렉토리를 설정
  • setValue() : 쿠키의 값을 설정 *
  • setVersion() : 쿠키 버전 설정
  • getMaxAge() : 쿠키 유효기간 정보를 얻음
  • getName() : 쿠키 이름을 얻음
  • getPath() : 쿠키사용의 유효 디렉토리 정보를 얻음
  • getValue() : 쿠키의 값을 얻음
  • getVersion() : 쿠키 버전을 얻음


예제

쿠키를 생성할 때는 먼저 쿠키클래스를 이용해 쿠키 객체를 생성하고, 속성을 설정한 뒤

이 객체를 response객체에 탑재해야 한다.

반대로 쿠키에서 정보를 얻어올 때는  request객체를 이용한다.

아래와 같이 쿠키를 생성할 수 있고,

1
2
3
4
5
    <%
        Cookie cookie = new Cookie("cookieN""cookieV"); //쿠키생성, name, value설정
        cookie.setMaxAge(60*60);    //1시간
        response.addCookie(cookie); //reponse객체에 cookie객체를 탑재
    %>
cs


이렇게 쿠키로부터 찾고자 하는 정보(myName의 이름을 가진 쿠키) 를 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
    <%
        Cookie[] cookies = request.getCookies();
 
        for(int i = 0; i < cookies.length; i++){
            String str = cookies[i].getName();
            if(str.equals("myName")){
                out.println("cookies[" + i + "] name :" + cookies[i].getName() + "<br />");
                out.println("cookies[" + i + "] value :" + cookies[i].getValue() + "<br />");
            }
        }
    %>
cs


쿠키를 삭제할 때는 setMaxAge 메소드를 사용해 쿠키의 지속시간을 0으로 설정해 주면 된다.

물론 0으로 설정한 후에 response객체에 다시 탑재해줘야 변경된 속성이 반영된다.




세션이란?

쿠키와 마찬가지로 서버와의 연결이 끊겼을 때 데이터를 유지하는 수단이다.

단, 쿠키와는 달리 서버상에 객체로 저장하게 된다.

클라이언트의 요청이 발생하면 자동으로 생성되며

세션 내부객체의 메소드를 이용하여 속성을 설정한다.


세션은 서버에서만 접근이 가능하여 보안이 쿠키보다 강하고, 데이터의 용량에 제한이 없다.

최근에는 쿠키보다 세션을 주로 사용하는 추세라고 한다.


세션 관련 메소드

  • setAttribute() :  세션에 데이터를 저장
  • getAttribute() : 해당하는 세션을얻음 (반환형 : Object)
  • getAttributeNames() : 세션에 저장되어 잇는 모든 데이터의 이름(유니크한 키값)을 얻음
  • getId() : 자동 생성된 세션의 유니크한 아이디를 얻음
  • isNew() : 세션이 최초 생성되었는지, 이전에 생성된 세션인지를 구분
  • getMaxInactiveInterval() : 세션의 유효시간을 얻음. 가장 최근 요청시점을 기준으로 카운트( apache-tomcat-\conf\web.xml 참고 )
  • removeAttribute() : 세션에서 특정 데이터 제거
  • invalidate() : 세션의 모든 데이터를 삭제


예제

먼저 다음과 같이 세션을 생성하고 초기화 한다.

1
2
3
4
5
    <%
        //session :  내부객체
        session.setAttribute("SessionName""SessionData");
        session.setAttribute("Num"123);
    %>
cs


세션의 데이터를 얻어오는 방법은 여러가지가 있다.

먼저, getter를 이용해 얻어오는 방법이다.

1
2
3
4
5
6
7
    <%
        Object obj1 = session.getAttribute("SessionName");        
        String SessionName = (String)obj1;
        
        Object obj2 = session.getAttribute("Num");
        Integer Num = (Integer)obj2;
    %>
cs


get메소드의 반환형이 object이기 때문에 캐스팅을 해주어야 한다.


다음으로 Enumeration을 이용한 방법이다.

1
2
3
4
5
6
7
8
9
10
11
    <%
        String sName;
        String sValue;
        Enumeration enumeration = session.getAttributeNames(); //모든이름값 다얻어옴
        while(enumeration.hasMoreElements()){
            sName = enumeration.nextElement().toString();
            sValue = session.getAttribute(sName).toString(); //이름통해서 value얻어옴
            out.println("sName : " + sName + "<br/>");
            out.println("sValue :" + sValue + "<br/>");
        }
    %>
cs



세션을 삭제할 때는 두 가지 방법이 있는데,

1
2
3
    <%
        session.removeAttribute("SessionName"); //특정세션삭제    
    %>
cs


이렇게 removeArrtibute 메소드를 사용하여 특정 세션을 삭제할 수 있고


1
2
3
    <%
        session.invalidate(); //모든세션삭제
    %>
cs


invalidate 메소드를 사용해 모든 세션을 삭제해줄 수 있다.