가희의자기개발블로그
Cookie 와 Session 본문
1.Cookies
쿠키는 클라이언트 컴퓨터에 저장된 텍스트 파일이다. JSP는 기본 서블릿 기술을 사용하여 HTTP쿠키를 투명하게 지원한다. HTTP 프로토콜은 클라이언트의 요청에 대한 응답을 하고 나면 해당 클라이언트와의 연결을 지속하지 않는(Connectionless)
재접속하는 클라이언트를 판단하는 과정
- 서버쪽에서 쿠키를 브라우저로 보낸다.(ex, 이름, 연령 또는 식별 번호)
- 브라우저는 서버에서 보낸 쿠키를 로컬 컴퓨터에 저장한다.
- 사용자가 이 브라우저를 이용해 특정사이트에 접속할 떄 저장되어 있는 쿠키의 정보가 함께 전송된다.
- 서버쪽에서는 이 정보를 이용해 사용자를 판단하다.
1_1_ Cookie의 구조
쿠키는 보통 HTTP header안에 세팅되어 있다.(JavaScript는 직접 브라우저에 쿠키를 설정할 수 있다.) 쿠키를 세팅하는 JSP는 다음과 같은 헤더를 보내게 된다.
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT;
path = /; domain = tutorialspoint.com
Connection: close
Content-Type: text/html
위 정보에서 볼 수 있듯이, Set-Cookie 헤더에는 이름 값 쌍, GMT 날짜(협정세계표준시), 경로 및 도메인정보를 가지고 있다. 이름과 value값은 URL로 인코딩 된다. expires 필드는 주어진 날짜와 시간이 지나면 해당 브라우저에 쿠키를 지우라는 명령을 갖고 있다.
즉, 브라우저가 쿠키를 저장한다면 이 정보들은 만료일 까지 브라우저에 저장된다는 것을 의미한다. 만약 사용자가 쿠키에 설정된 경로로 접속을 하게되면 브라우저는 서버로 그 쿠키를 재전송한다. 그 브라우저의 헤더는 다음과 같은 정보를 갖고 있다.
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name = xyz
이제 JSP script는 request메소드 중 하나인 request.getCookies()를 통해서 쿠키에 접근 할 수 있다.
1_2_ Servlet Cookies 메소드
1 |
public void setDomain(String pattern) This method sets the domain to which the cookie applies; for example, tutorialspoint.com. |
2 |
public String getDomain() This method gets the domain to which the cookie applies; for example, tutorialspoint.com. |
3 |
public void setMaxAge(int expiry) This method sets how much time (in seconds) should elapse before the cookie expires. If you don't set this, the cookie will last only for the current session. |
4 |
public int getMaxAge() This method returns the maximum age of the cookie, specified in seconds, By default, -1 indicating the cookie will persist until the browser shutdown. |
5 |
public String getName() This method returns the name of the cookie. The name cannot be changed after the creation. |
6 |
public void setValue(String newValue) This method sets the value associated with the cookie. |
7 |
public String getValue() This method gets the value associated with the cookie. |
8 |
public void setPath(String uri) This method sets the path to which this cookie applies. If you don't specify a path, the cookie is returned for all URLs in the same directory as the current page as well as all subdirectories. |
9 |
public String getPath() This method gets the path to which this cookie applies. |
10 |
public void setSecure(boolean flag) This method sets the boolean value indicating whether the cookie should only be sent over encrypted (i.e, SSL) connections. |
11 |
public void setComment(String purpose) This method specifies a comment that describes a cookie's purpose. The comment is useful if the browser presents the cookie to the user. |
12 |
public String getComment() This method returns the comment describing the purpose of this cookie, or null if the cookie has no comment. |
1_3_ JSP에 Cookies를 세팅하는 방법
1단계, 쿠키 객체 생성
Cookie cookie = new Cookie("key","value");
2단계, Max age 설정
초 단위로 max age를 설정한다. 즉. 이 쿠키가 살아있을 수 있는 시간을 설정하는 거다.
cookie.setMaxAge(60*3);//초단위
위 설정된 시간이 지나면 쿠키명(세션 아이디)은 JSESSIONID 그 값은 9F4A2FDF656700F44A9B0F900ACD7F77 이런 값이 나온다. 왜그럴까? 이것은 클라이언트가 서버에 요청을 할때 로그인 했다는 정보를 주면 서버는 그걸 받아 쿠키를 만든다. 그런데 여러대의 컴퓨터에서 서버에 요청을 하면 그 수만큼 쿠키를 만들어 줘야 하는데 이걸 구분해 주는 게 없으면 어느 컴퓨터의 쿠키인지를 알수 없다. 그래서 클라이언트가 서버에 요청을 할때 아이디와 비밀번호 값과 함께 해당 컴퓨터의 아이디를 가지고 들어온다. 그럼 서버는 그걸 기반으로 어느 컴퓨터의 쿠키인지 알 수 있는것이다.
3단계,Cookie를 HTTP response header에 쿠키를 보내기
response.addCookie(cookie);
1_4_ JSP를 이용하여 쿠키정보 읽어오기
쿠키를 읽으려면 HttpServletRequest의 getCookies()메소드를 호출하기만 하면 된다. 이 메소드는 Cookie[]를 반환한다. 즉, 한번에 여러개의 쿠키가 전송된다는 것이다.
1_5_ JSP를 이용한 쿠키 삭제
쿠키 삭제는 브라우저에서도 할 수 있지만 개발자가 직접 컨트롤 할 수도 있어야 한다. 사실 쿠키를 삭제하는 메서드는 따로 없다. 그러므로 setMaxAge()를 0으로 설정하면 된다.
1_6_ 쿠키 단점
- 사생활 침해의 가능성이 있다.
- 쿠키는 단 한개만 가져 올 수 없다. 모든 쿠키를 가져와야 하기때문에 배열을 이용해 줘야 한다.
위 설정된 시간이 지나면 쿠키명(세션 아이디)은 JSESSIONID 그 값은 9F4A2FDF656700F44A9B0F900ACD7F77 이런 값이 나온다. 왜그럴까? 이것은 클라이언트가 서버에 요청을 할때 로그인 했다는 정보를 주면 서버는 그걸 받아 쿠키를 만든다. 그런데 여러대의 컴퓨터에서 서버에 요청을 하면 그 수만큼 쿠키를 만들어 줘야 하는데 이걸 구분해 주는 게 없으면 어느 컴퓨터의 쿠키인지를 알수 없다. 그래서 클라이언트가 서버에 요청을 할때 아이디와 비밀번호 값과 함께 해당 컴퓨터의 아이디를 가지고 들어온다. 그럼 서버는 그걸 기반으로 어느 컴퓨터의 쿠키인지 알 수 있는것이다.
※공부하다 알게 된점 추가
웹프로젝트에서 쿠키를 전혀 생성해 주지 않고 쿠키를 getCookies() 해주니까 Cookie의 길이가 1로 나온다. 나는 분명히 쿠키를 생성하지 않았는데 존재하는 쿠키가 있어서 그 쿠키의 value와 name을 찍어보니까 아래의 값이 나왔다.
JSESSIONID 3313F353E9A2DD7D117E2194FD40EEC0
위에서 잠깐 JSESSIONID에 대해 언급했지만 나도 정확히 이 개념을 알고 있지 않아 서칭해봤다.
우선 이 쿠키가 왜 이 값을 가지고 있는지에대해 설명을 하기 위해서는 JSESSIONID에 대해 이해 하고 있어야 했다.
아래 포스팅에 JSESSIONID에 대해 포스팅 해놨다. 참고하자
2_ SESSION
세션이란 일정 시간동안 같은 사용자(정확하게 브라우저를 말한다)로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이라고 한다.
또한 여기서 일정 시간이란 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점으로부터 웹 브라우저를 종료함으로써 연결을 끝내는 시점을 말하며 즉, 방문자가 웹서버에 접속해 있는 상태를 하나의 단위로 보고 세션이라고 칭한다는 것.
: 웹서버쪽의 웹컨테이너에 상태를 유지하기 위한 정보가 저장
: 세션이 정보를 갖고 있는 기본 시간 1800초(30분)
: 장바구니
HTTP는 STATELESS프로토콜이다. 클라이언트가 웹페이지를 불러올때마다 클라이언트는 웹서버로 별도의 커넥션을 맺는다. 그리고 이전 클라이언트의 접속에 대한 어떠한 정보도 자동으로 기록하지 않는다. 이 세션을 유지하는 방법에는 여러가지가 있다.
첫번째, Cookies
쿠키에 세션ID를 저장하는 식으로 세션을 관리할 수는 있겠지만 브라우저에서 쿠키 사용 제한 설정이 있을 수 있기떄문에 세션을 쿠키를 이용해서 관리하는것은 좋은 방법이 아니다.
두번째, Hidden Form Fields
웹서버는 hidden HTML form filed에 unique session ID를 넣어서 아래처럼 전송할 수 있다.
<input type = "hidden" name = "sessionid" value = "12345">
form이 전송될 떄 세션ID와 값을 넘겨주는 것이다. 브라우저에서 이 정보를 웹서버에 보내면 이 정보를 가지고 웹서버에서는 다른 브라우저에서 접속한 것인지를 판단할 수 있게 된다. 하지만 이역시 좋은 방법은 아니다. <a>태그를 이용해 링크를 타고 들어오는 경우에는 이 <form>데이터를 전송하지 않기 떄문이다.
세번째, URL Rewritng
URL 끝에 세션에 대한 정보를 추가 할 수도 있다. 그리고 서버는 그 정보를 가지고 세션을 비교할 수 있다. 예를들면, http://tutorialspoint.com/file.htm;sessionid=12345이런식으로 요청을 보내면 서버에서 sessionid=12345 부분에 대한 정보를 가지고 웹서버의 세션정보와 비교를 한다. URL rewriting은 세션을 관리하기 위한 방법들 중에서는 그나마 좋은 방법이다. 브라우저가 쿠키사용을 안할때도 사용가능한 방법이기 때문이다. 하지만, 세션 ID를 정적인 HTML페이지라도 동적으로 매번 생성해줘야한다.
이 세가지 방법 이외에서 JSP는 HttpSession 인터페이스를 사용할 수 있다.
2_1). HTTP Session이란?
1) session이란 서버가 해당 서버(웹)로 접근(request)한 클라이언트(사용자)를 식별하는 방법(HttpSession 객체가 새로운 클라이언트들이 접속할 때마다 자동으로 생성된다. )
이 세션 추적 기능을 끄려면 page directive의 세션 속성을 false로 세팅해줘야 한다.
<%@ page session = "false" %>
2) 서버(웹)는 접근한 클라이언트(사용자)에게 response-header field인 set-cookie 값으로 클라이언트 식별자인 session-id(임의의 긴 문자열)를 발행(응답)한다.
3) 서버로부터 발행(응답)된 session-id는 해당 서버(웹)와 클라이언트(브라우저) 메모리에 저장된다. 이때 클라이언트 메모리에 사용되는 cookie 타입은 세션 종료 시 같이 소멸되는 "Memory cookie"가 사용된다.
4) 서버로부터 발행된 session(데이터)을 통해 개인화(사용자)를 위한 데이터(userInfo 등..)로 활용할 수 있다.
2_1_1) HTTP Session 동작 순서
1) 클라이언트(사용자)가 서버로 접속(http 요청)을 시도한다.
2) 서버(웹)는 접근한 클라이언트의 request-header field인 cookie를 확인해 클라이언트가 해당 session-id를 보내왔는지 확인한다.
3) 만약 클라이언트로 부터 발송된 session-id가 없다면, 서버는 session-id를 생성해 클라이언트에게 response-header field인 set-cookie 값으로 session-id(임의의 긴 문자열)를 발행(응답)한다.
2_2) 세션불러오기
HttpSession session = request.getSession();
만약 JSP파일에서 위 메소드를 호출 하면이렇게 하면 에러가 뜬다. 그 이유는 jsp가 자체적으로 servlet자바 파일을 생성하면서 거기에 session을 만들어 주기 때문에 로컬변수가 중복되었다는 에러를 낸다. 그래서 jsp에는 위 코드를 쓸 필요가 없다.(이미 자동적으로 만들어 졌기 때문) 하지만 그 외에, class파일에서는 위 함수를 꼭 호출해 줘야 한다.
session.setMaxInactiveInterval(30*60);//초단위
세션부여
session.setAttribute(“세션명”, “값”)
세션 얻어오기
session.getAttribute(“세션명”)
세션 삭제
session.removeAttribute(“세션명”)
모든 세션 삭제 -무효화
session.invalidate()
usecase와 시퀀스다이어그램, 클래스 다이어그램 무조건 그려줘야 한다.
'백엔드 > JSP' 카테고리의 다른 글
JSESSIONID (0) | 2020.07.07 |
---|---|
기초- JSP프로젝트 구조 (0) | 2020.06.16 |
MVC (0) | 2020.06.16 |
Connection Pool (0) | 2020.06.12 |
JSP DIRECTIVE - JSP include directive (0) | 2020.06.10 |