Daily coding
Servlet : Cookie와 Session 본문
> Cookie와 Session
login 후 필요 정보-> ID(String), 정보(Object : Id, pw ...)
HTTP의 쿠키와 세션이 필요한 이유 ?
: HTTP 프로토콜의 서버는 항상 클라이언트가 누구인지 확인 해야한다.
클라이언트가 요청을 한 후 응답을 받게되면 HTTP 프로토콜은 그 연결을 끊는데,
연결 비용을 줄이기 위해 커넥션을 재활용한다. (connectionless)
또한 통신이 끝나면 상태를 유지하지 않는 특징이 있어, 클라이언트가 요청한 상태정보는 유지하지 않게 된다 (stateless)
이러한 HTTP의 두가지 특성 때문에, 클라이언트가 요청한 정보를 담아둘 cookie나 session이 없다면
매 페이지마다 로그인을 해야하는 등의 불상사가 발생할 수 있다.
1. Cookie
key 와 value 로 이루어 짐
저장공간(Client), String, 지울 때까지 하드웨어에 남아있음
데이터는 클라이언트(브라우져) 로컬에 저장되는 데이터 파일
ex) id, password 등을 저장하는 공간, 방문횟수 저장가능
Java, Java Script에서 접근이 가능. (주로 JS에서 사용)
저장 기한을 설정 가능하며 설정 후에는 브라우져 종료해도 인증이 유지됨
웹페이지의 개발자도구 -> Application -> cookie에서 확인가능
키값 중복이면 덧씌워짐
* 쿠키 생성하기
// cookie & Session
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Cookie : HttpServletRequest 소속의 addCookie로 저장해준다
Cookie cookie = new Cookie("id", "abcd123");
resp.addCookie(cookie);
cookie = new Cookie("pwd", "aabbcc");
resp.addCookie(cookie);
resp.setContentType("text/html; charset=UTF-8");
PrintWriter pw = resp.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("<title>제목</title>");
pw.println("<body>");
pw.println("<p>Hello Servlet</p>");
pw.println("<a href= dispCookie> Cookie를 표시</a>");
pw.println("</body>");
pw.println("</head>");
pw.println("</html>");
pw.close();
}
* 쿠키 생성 및 추가 방법
: Cookie 타입의 변수를 생성한 뒤, key와 value 값을 지정해 생성한다.
HttpServletRequest 소속의 addCookie로 저장해준다.
* 저장한 쿠키 확인하기
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=UTF-8");
PrintWriter pw = resp.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("<title>제목</title>");
pw.println("<body>");
pw.println("<p>Display Cookie</p>");
// Java를 사용해서 쿠키를 보여주기
Cookie cookies[] = req.getCookies(); // 배열로 받아야함
if( cookies != null ) {
for (int i = 0; i < cookies.length; i++) {
String value = cookies[i].getValue();
// getValue 사용해서 쿠키 값(String) 가져오기
pw.println("<p>");
pw.println(cookies[i].getName());
//getName으로 쿠키 이름을 가져오기 (String)
pw.println(":");
pw.println(value);
pw.println("</p>");
}
}
pw.println("<a href=visitedCookie>방문횟수</a>");
pw.println("</body>");
pw.println("</head>");
pw.println("</html>");
pw.close();
}
* 저장한 쿠키 확인하기
: HttpServletRequest 소속의 getCookies() 함수 사용
- 쿠키는 여러개가 있을 수 있으므로 반드시 배열 데이터로 받도록 한다
- 키 값은 중복될 수 없다. 같은 키값을 사용하면 기존의 데이터에 덮어씌워진다.
- 쿠키의 값 갱신하기
쿠키변수이름.setValue ( 갱신할 값 (String) );
// 기존의 쿠키의 값을 setValue를 통해 갱신할 수 있다.
- 쿠키의 저장 기한을 설정
visitCookie.setMaxAge(" 기한 ");
// 기한 설정(초단위로 한다): 365 * 24 * 60 * 60 ( = 1년)
* 쿠키는 String 이기 때문에 다른 데이터 타입은 형변환을 해주어야 함
2. Session
쿠키를 기반으로 하고 있으나, 상태정보를 브라우저가 아닌 서버에서 관리한다
서버에서 클라이언트를 구분하기 위해 세션 ID를 부여하고 서버에 접속해 브라우져를 종료할 때까지 인증을 유지함
저장공간 (Server) -> Container의 한 부분에 저장됨 (Tomcat 등의 WAS)
쿠키보다 보안에 좋으나 사용자가 많아질수록 서버 메모리를 많이 차지하여 서버가 무거워진다.
Object 저장 가능
setAttribute, getAttribute로 접근 가능
세션에다 저장하면 정보들이 서버 측에 일정시간동안 저장된다 (시간은 설정가능)
ex) id, MemberDto, 방문횟수 등의 정보를 넣어둠
(서버 해킹당하면 정보가 유출 될수 있으므로 아이디, 패스워드 등의 정보는 넣어두지 않는다)
저장기한을 설정 가능 (설정 주로 해두는 편) : 사용하지 않는경우 시간 제한있고, 시간지나면 로그아웃
한글세션 사용금지 ( setAttribute("한글x", Object) )
< 세션 설정하기 >
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//session으로 방문횟수 설정하기
resp.setContentType("text/html; charset=UTF-8");
PrintWriter pw = resp.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("<title>제목</title>");
pw.println("<body>");
pw.println("<h1>Hello Session Servlet</h1>");
// session : HttpRequest 소속
HttpSession session = req.getSession(false);
/*
getSession(false)
session Object가 존재하면, 현재 http 세션을 반환.
존재하지 않으면 그냥 null을 반환
getSession(true)
session Object가 존재하면, 현재 http 세션을 반환.
존재하지 않으면 새로생성한다
*/
// getSession(false) 일 경우, session=null일 때 null반환
if(session == null) {
session = req.getSession(true);
session.setMaxInactiveInterval(60); // 365 * 24 * 60 * 6 (=1년)
session.setAttribute("visited", "1");
pw.println("<p>첫번째 방문 입니다.</p>");
}
else {
// 이미 생성되있음
String visited = (String)session.getAttribute("visited"); // Object 타입이므로 캐스트 변환
int count = Integer.parseInt(visited);
count++;
pw.println("<p>방문횟수는 "+ count + "회 입니다.</p>");
session.setAttribute("visited",count+"");
}
pw.println("</body>");
pw.println("</head>");
pw.println("</html>");
pw.close();
}
* HttpServletRequest 소속의 getSession 메소드로 session을 꺼낼 수 있다 ( HttpSession 타입 )
****
getSession(false)
: session Object가 존재하면, 현재 http 세션을 반환.
존재하지 않으면 그냥 null을 반환
getSession(true)
: session Object가 존재하면, 현재 http 세션을 반환.
존재하지 않으면 새로 생성 한다
****
* 세션 ID와 값 설정하기
setAttribute( "세션id", Object )
: 세션 id를 직접 부여하고 데이터를 담는다
데이터는 Oject 타입으로, 인스턴스를 담아 보낼 수 있다
* 세션 저장 기한 설정하기
setMaxInactiveInterval (초)
: 세션 정보가 저장되는 만료기한을 정한다.
페이지에 일정시간동안 응답이 없으면 자동으로 세션이 만료되는 방식
* 세션 정보 불러오기
getAttribute("세션id")
: 세션정보를 얻어오고 싶을 때는 설정한 id 값을 알아야 한다.
세션 정보는 Object 타입으로 불러오며 형변환하여 사용한다.
* 세션 정보를 한번에 불러오기
// 세션의 정보를 한번에 볼 수 있는 것 : Enumeration
Enumeration<String> enum_session = session.getAttributeNames();
while(enum_session.hasMoreElements()) { // iterator의 hasNext와 비슷한 기능
String key = enum_session.nextElement();
String value = (String)session.getAttribute(key);
pw.println("<p>"+key+" : " +value+ "</p>");
}
* Enumeration<String> 타입을 사용하여 세션에 들어있는 id(key)와 value를 한번에 불러올 수 있다
: 세션 id를 모두 담아와 저장한 다음, while문으로 아이디 값을 모두 꺼낸다.
그리고 그 각각의 key(=id)를 통해 value값을 불러오도록 한다
- session 타입의 메소드 getAttributeNames
: 세션의 이름만 모두 불러온다.
Enumeration 메소드
- hasMoreElements () : 다음 값이 있는 지 확인
- nextElement () : 다음 enum 객체를 불러온다
* 세션 각각 데이터를 지우기
removeAttribute( "세션id")
- 해당 메소드를 통해 세션아이디를 지정하면 세션에 들어간 정보를 지울 수 있다
* 세션 자체를 지우기
invalidate()
: 세션을 만료시키는 함수
주로 로그아웃일 경우, 호출한다
( 로그인 정보를 세션에 저장한 뒤 로그아웃시 세션을 삭제한다 )
'Front-end > 비동기통신' 카테고리의 다른 글
JSP : jsp 작성해보기 - 변수, 조건문/반복문, jsp 구조와 class import (0) | 2020.01.20 |
---|---|
JSP : JSP 개념과 기본 (0) | 2020.01.20 |
Servlet : include 방식과 forward방식 (0) | 2020.01.18 |
Servlet : 정리 (0) | 2020.01.18 |
Servlet : servlet 과 jsp 연결하기 (0) | 2020.01.18 |