Datebase

쿠키(Cookie)와 세션(Session) - JSP

엘호리스 2018. 1. 31. 15:14

쿠키 (Cookie)

개요

쿠키(Cookie)라는 개념을 이해하기 이전에 먼저 용어의 유래를 알아보자.

우리가 흔히 알고있는 과자 '쿠키'는 그림 동화 '헨젤과 그레텔'에서 지나온 길에 쿠키 조각을 떨어뜨려 표시를 했다는 이야기에서 유래되었다고 합니다. (정확하지 않습니다 ^^;) 어쨋든 사용하려는 쿠키는 서구권의 먹는 쿠키(Cookie)에서 비롯되었다는 것은 사실이니 어떤 역할을 하는지에 대한 이해를 높이기 위해 연상을 하는것은 좋은 학습방법이라 생각된다.


쿠키는 무엇?

쿠키는 웹 브라우저의 정보를 웹 브라우저에 저장하여 웹 서버에게 자신임을 증명하는 역할을 하는 임시파일이다.


구글 크롬 개발자 도구(F12)로 Application 탭에 Storage 란에 Cookies 항목이 있는걸 확인할수 있다.




쿠키를 왜 쓰는가?



HTTP 프로토콜은 상태가 없다. 지금 나의 상태에 대한 정보를 갖고 있지 않기 때문에 쿠키가 없다면 이메일을 확인할 때마다 혹은 글쓰기를 할때마다 로그인을 해야 한다. 온라인 쇼핑몰에서 장바구니 역할을 하는것도 쿠키가 있기에 가능한 작업이다.

쿠키의 동작 방식


JSP에서 쿠키 생성 및 사용

JSP에서 쿠키를 사용하기 위해서는 javax.servlet.http 패키지에 있는 Cookie 클래스의 객체를 생성해서 사용한다.


1
2
3
4
5
6
7
//쿠키 생성
Cookie ck = new Cookie(String nameString value);
//쿠키에 필요한 설정
ck.setMaxAge(60*2); //쿠키의 수명(지속시간)
ck.setDomain("lhoris.tistory.com"); //도메인 설정
ck.setSecure(true); //쿠키의 보안 설정
response.addCookie(ck); //response객체에 쿠키를 전송
cs


쿠키 프로그래밍 작업 과정

  • 쿠키 생성
  • 쿠키에 필요한 설정(유효시간,도메인,패스,보안 등)
  • 웹 브라우저에 쿠키 전송


  • 웹 브라우저의 요청에서 쿠키를 얻어옴
  • 쿠키(name,value) 객체 배열 형태로 리턴. 리턴 된 쿠키의 배열에서 쿠키이름을 가져옴
  • 쿠키이름을 통해 해당 쿠키의 설정값을 추출


쿠키 관련 메서드


 메서드

설명 

String getCommnet() 

 쿠키에 대한 설명을 가져온다. 

String getDomain() 

 쿠키의 유효한 도메인 정보를 가져온다. 

int getMaxAge() 

 쿠키의 사용할 수 있는 시간에 대한 정보를 가져온다. 

String getName()

 쿠키의 이름을 가져온다 

String getPath() 

 쿠키의 유효한 디렉토리 정보를 가져온다. 

boolean getSecure() 

 쿠키의 보안이 어떻게 설정되어 있는지 가져온다. 

String getValue() 

 쿠키에 설정된 값을 가져온다. 

int getVersion() 

 쿠키의 버전을 가져온다. 

void setComment(String) 

 쿠키에 대한 설명을 설정한다. 

void setDomain(String) 

 쿠키에 유효한 도메인을 설정한다. 

void setMaxAge(int) 

 쿠키의 유효한 시간을 설정한다. 

void setPath(Striong) 

 쿠키를 전송할 경로를 설정한다.

void setSecure(boolean) 

 쿠키의 보안을 설정한다. 

void setValue(String) 

 쿠키의 값을 설정한다. 

void setVersion(int) 

 쿠키의 버전을 설정한다. 


쿠키의 문제점

쿠키는 사용자의 상태 유지를 위해 정보를 웹 브라우저에 저장하는데 웹 서버가 열어볼 수 있다는 점에서 보안상 문제가 된다. 기본적으로 HTTP 프로토콜은 암호화되어 통신하지 않는다. 따라서 스니핑(sniffing) 툴을 이용하여 쉽게 그 내용을 옅볼수 있다. 그 내용중에는 쿠키 정보도 포함되며 만약 어떤 사이트에서 쿠키 데이터에 사용자 아이디 같은 정보를 저장하고 그 정보를 이용하여 로그인 된 사용자 아이디를 식별한다면 변조 툴을 이용하여 쉽게 웹서버를 속일 수 있을 것이다.






세션 (Session)

개요

쿠키가 웹 브라우저에 사용자의 상태를 유지하기 위한 정보를 저장했다면, 세션은 웹 서버 쪽의 웹 컨테이너에 상태를 유지하기 위한 정보를 저정한다. 세션은 사용자의 정보를 유지하기 위해 javax.servlet.http 패키지의 HttpSession 인터페이스를 구현해서 사용한다. 쿠키는 사용자의 상태 유지를 위한 정보를 웹 브라우저에 저장해서 웹 서버가 쿠키 정보를 읽어서 사용한다. 이렇게 웹 브라우저에 저장된 쿠키들은 웹 서버가 열어볼 수 있다는 점에서 보안상 문제가 될 수 있다.

따라서 사용자의 정보를 유지하기 위해서는 쿠키를 사용하는 것보다 세션을 사용한 웹 브라우저와 웹 서버의 상태 유지가 훨씬 안정적이고 보안상의 문제도 해결할 수 있다. 세션은 웹 브라우저당 1개씩 생성되어 웹 컨테이너에 저장된다.

웹 서버는 각각의 웹 브라우저로부터 발생한 요청에 대해 특정한 식별자를 부여한다. 이후에 이 식별자를 웹 브라우저에서 발생한 요청들과 비교해서 같은 식별자인지를 구별하게 된다. 이 특별한 식별자에 특정한 값을 넣을 수 있고, 이것을 사용해서 세션을 유지하게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 로그인확인
String id     = request.getParameter("id");
String passwd = request.getParameter("passwd");
LogonDBBean dao     = LogonDBBean.getIntance();
boolean     loginok = dao.login(id, passwd);
 
String url = "";
Cookie cookie = null;
if( loginok  ) {
    // 로그인 후 세션 아이디와 패스워드를 저장 
    //session은 내장 객체라 new 할 필요 없음
    session.setAttribute("id", id);
    session.setAttribute("passwd", passwd);
    url = "list.jsp";
else {
    url = "login.html";
}
response.sendRedirect(url);
cs