[필독][기초] / 서블릿 / servlet [part 9]

2016. 1. 5. 15:02language/jsp

쿠키
HTTP 프로토콜은 상태를 유지할 수 없는 프로토콜이다.
쿠키는 HTTP 프로토콜의 특징상 각각의 웹 브라우저가 서버와의 통신에서 세션을 유지하지 못하는 것을 보완하기 위한 기술이다.
서버가 쿠키를 전송하면 웹 브라우저는 그 다음 요청마다 쿠키 값을 서버로 전달하여 사용자 정보를 유지할 수 있게 한다.



서버 -> 웹 브라우저
쿠키가 작동하려면 서버에서 쿠키값을 클라이언트로 전송해야 한다.
이것을 쿠키를 굽는다고 표현하는데 아래와 같은 정보가 서버로부터 웹 브라우저에 전달되고 웹 브라우저가 관리하는 폴더에 파일로 저장된다.

Set-Cookie : name = value ; expires = date ; path = path ; domain = domain ; secure



웹 브라우저 -> 서버
쿠키가 웹브라우저에 셋팅되면, 웹브라우저는 쿠기를 전달해준 서버로 요청시마다 아래와 같은 문자열을 서버로 보낸다. Cookie ; name = value1 ; name2 = value2 ;
쿠키 이름과 값에는 []()="/?@:; 와 같은 문자는 올 수 없다.
다음은 쿠키를 설정하는 절차이다.


쿠키 설정 절차
1) Cookie 객체를 만든다. Cookie(String name, String value)
 2) 다음 메소드를 이용해 쿠키에 속성을 부여한다.


메소드와 설명

setValue(String value)

          생성된 쿠키의 값을 재설정할 때 사용한다.
setDomain(String pattern)

          쿠키는 기본적으로 쿠키를 생성한 서버에만 전송된다.
          같은 도메인을 사용하는 서버에 대해서 같은 쿠키를 보내기 위해서 setDomain()을 사용한다.
          주의할 점은 쿠키를 생성한 서버와 관련이 없는 도메인을 setDomain()에 값으로 설정하면

          쿠키가 구워지지 않는다는 것이다.
setMaxAge(int expiry)

          쿠키의 유효기간을 초단위로 설정한다.
          음수 입력시에는 브라우저가 닫으면 쿠키가 삭제된다.
setPath(String uri)

          쿠키가 적용될 경로 정보를 설정한다.
          경로가 설정되면 해당되는 경로로 방문하는 경우에만 웹브라우저가 쿠키를 웹서버에 전송한다.
setSecure(boolean flag)

          flag가 true이면 보안채널을 사용하는 서버의 경우에 한해 쿠키를 전송한다.
3) 웹브라우저에 생성된 쿠키를 전송 : resp.addCookie(cookie);




구워진 쿠키 이용
위에서 쿠키를 설정했다면 이제 서블릿에서 쿠키 이용하는 방법에 대해 알아본다.


Cookie[] cookie = req.getCookies();


HttpServletRequest 의 getCookies() 메소드를 사용해서 쿠키배열을 얻는다.
만약 구워진 쿠키가 없다면 getCookies() 메소드는 null 을 리턴한다.
다음 메소드를 이용하면 쿠키에 대한 정보를 얻을 수 있다.
이중 getName()과 getValue()가 주로 쓰인다.


Cookie 메소드와 설명

getName()

          쿠키의 이름을 구한다.
getValue()

          쿠키의 값을 구한다.
getDomain()

          쿠키의 도메인을 구한다.
getMaxAge()

          쿠키의 유효시간을 구한다.


다음은 서버 사이드에서 쿠키값을 알아내는 코드조각이다.
예에서는 쿠키 이름이 id에 해당하는 쿠키값을 반환하는 예이다.


String id = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
  for (int i = 0; i < cookies.length; i++) {
    String name = cookies[i].getName();
    if (name.equals("id")) {
      id = cookies[i].getValue();
                break;
    }
  }
}


아래는 쿠키를 삭제하는 예이다.
방법은 삭제하고자 하는 쿠키와 같은 이름의 쿠키를 생성하고 setMaxAge(0) 을 호출한다.


Cookie cookie = new Cookie("id","");
cookie.setMaxAge(0);
resp.addCookie(cookie);


쿠키에 대한 실습은 JSP에서 다룬다.



세션
세션은 쿠키 기반 기술로 쿠키의 보안상 약점을 극복하기 위한 기술이다.
쿠키와 다른 점(즉, 보안상 개선된 점)은 웹브라우저는 서버가 정해준 세션ID 만을 쿠키값으로 저장한다는 것이다.
세션이 생성되면 서버에서는 세션ID에 해당하는 HttpSession 객체를 서블릿 컨테이너가 연결시켜 준다.
아래는 세션 생성하는 코드이다.


HttpSession session = req.getSession(true); //세션이 없으면 생성
HttpSession session = req.getSession(false); //세션이 없다면 null리턴


세션 객체가 생성되었으면 세션에 정보를 아래코드처럼 저장할 수 있다.


User user = new User("홍길동","1234");
session.setAttribue("user", user); //user 이름으로 user 객체 저장



참고
http://docs.oracle.com/javaee/7/api/index.html?overview-summary.html
http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
http://commons.apache.org/proper/commons-io/download_io.cgi
http://commons.apache.org/proper/commons-fileupload/using.html
http://www.albumbang.com/board/board_view.jsp?board_name=free&no=292
http://www.docjar.com/docs/api/javax/servlet/GenericServlet.html
http://www.java-school.net/jsp/Servlet