HTTP통신방법
HTTP는 서버와 client간의 요청과 응답으로 데이터를 주고 받는 형식으로
서버는 client의 요청에 응답을 하고 나면 그 연결을 끊어버림(stateless)
client는 다시 서버에 요청하려면 새로 연결하여 응답을 받아야 한다.
문제점
연결이 끊어지기 때문에 유지되어야 하는 정보들이 사라지는 문제가 발생을 한다.
(예 로그인된 후 로그인 정보, 장바구니에 넣은 데이터 등)
Session과 Cookie
연결이 끊어진 이후에도 client에 대한 정보를 유기하기 위해
Server에서 데이터를 보관하는 방법과 client에 데이터를 보관하는 방법 두가지가 있는데
서버측에 데이터를 보관하는 방법을 Session이라고 하고,
client측에서 데이터를 보관하는 방법이 Cookie이다.
** HTTP Request / Response 프로토콜 헤더에 관련 정보를 전송하여 공유함
1. Cookie
Cookie란(패키지 : javax.servlet.http.Cookie) 클라이언트 즉 사용자 컴퓨터에 데이터를 저장하는 기술
필요시에 해당하는 정보를 서버와 공유하여 정보를 유지하는 것이다.
Map형식으로 저장이 되고, 데이터의 크기, 개수에 제한이 있음
쿠키유지시간, 유효디렉터리, 유효도메인 등을 설정할 수 있다.
속성설정
name=value : ASCII문자만 사용 / 한번 설정된 쿠키의 name은 수정 못함.
expire=‘날짜’ : 쿠키의 유지시간 설정 없으면 브라우저 동작 동안 유지
path=‘경로’ : 쿠키가 전달되는 서버의 유효디렉터리를 지정하는 속성
domain=‘서버정보’ : 쿠키가 전달되는 유효 서버설정
secure : https나 ssl보안프로토콜로 요청할때만 서버전송
Cookie설정 전송
Cookie클래스 생성(패키지 import)
Cookie 쿠키명 = new Cookie("name",value);
생성된 쿠키설정
setMaxAge(int expiry) : 유효시간설정
setPath(String uri) : 경로설정
** 서버의 모든 요청 X / 특정 경로를 통한 요청시 쿠키를 사용하는 경우
setDomain(String domain) : 쿠키도메인 설정, 쿠키생성 **
** 도메인 외의 도메인 설정시 사용
생성된 쿠키 전송 response.addCookie(Cookie cookie) : 생성된 쿠키전송
@WebServlet("/cookie")
public class CookieHandlerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
/* 쿠키를 사용하는 방법은 간단하며, 쿠키를 사용하는 절차가 있다.
* 1. 쿠키를 생성한다.
* 2. 해당 쿠키의 만료 시간을 설정한다.
* 3. 응답 헤더에 쿠키를 담는다.
* 4. 응답 한다.
*
* 하지만 쿠키는 일부 제약 항목이 있다.
* 쿠키의 이름은 아스키코드 문자만을 사용해야하며, 한번 설정한 쿠키의 이름은 변경할 수 없다.
* 또한 공백문자와 일부 특수문자([] () = , " \ ? @ : ;)를 사용할 수 없다.
* */
Cookie firstNameCookie = new Cookie("firstName", firstName);
Cookie lastNameCookie = new Cookie("lastName", lastName);
// 초 단위 설정으로 하루를 만료시간으로 둘 때의 예시
firstNameCookie.setMaxAge(60 * 60 * 24);
lastNameCookie.setMaxAge(60 * 60 * 24);
response.addCookie(firstNameCookie);
response.addCookie(lastNameCookie);
response.sendRedirect("redirect");
}
}
전송 Cookie활용
client 전송한 Cookie읽어오기 (HttpServletRequest객체 이용)
request.getCookies()매소드활용 쿠키객체 배열로 리턴
예) Cookie[] list=HttpRequest.getCookies();
쿠키값 호출
getName() / getValue()를 이용하여 이름과 값 호출
Cookie[] list=HttpRequest.getCookies();
for(Cookie c : list) {
System.out.print(c.getName()+ " : " +c.getValue());
}
** 쿠키 저장된 정보를 가지고 로그인 확인 및 팝업창 설정 등을 할 수 있음.
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* 쿠키를 사용하는 방법
* 1. request에서 쿠키 목록을 쿠키 배열 형태로 꺼내온다.
* 2. 쿠키의 getName과 getValue를 이용해 쿠키에 담긴 값을 사용한다.
* */
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
System.out.println("[cookie] " + cookies[i].getName()
+ " : " + cookies[i].getValue());
if("firstName".equals(cookies[i].getName())) {
firstName = cookies[i].getValue();
} else if("lastName".equals(cookies[i].getName())) {
lastName = cookies[i].getValue();
}
}
StringBuilder responseText = new StringBuilder();
responseText.append("<!doctype html>\n")
.append("<html>\n")
.append("<head>\n")
.append("</head>\n")
.append("<body>\n")
.append("<h3>your first name is ")
.append(firstName)
.append(" and last name is ")
.append(lastName)
.append("<h3>\n")
.append("</body>\n")
.append("</html>\n");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print(responseText.toString());
out.flush();
out.close();
}
}
쿠키는 텍스트 파일 형태로 클라이언트 컴퓨터에 저장된다
다른 사용자와 함께 사용하는 컴퓨터인 경우 쿠키에 민감한 개인 정보를 담시에는 보안에 취약해지는 문제가 있다.
따라서 민감한 개인 정보를 취급하는 경우에는 쿠키보다는 세션을 이용하게 된다.
세션은 쿠키와 유사한 형태로 key=value 쌍으로 저장되지만 서버에서 관리 되기 때문에 보안에 더 우수하다.
2. Session
Session란(패키지 : javax.servlet.http.HttpSession)
서버에 데이터를 저장하는 기술로 client에는 Session ID를 부여하고
client가 request에 SessionID를 보내면 ID를 기준으로 일치하는 Session정보를 컨테이너가 생성하여
그 객체의 데이터를 가져와 사용한다.
만일 client가 보낸 SessionID가 없으면 새로 객체를 생성
Session 생성
Session객체를 컨테이너가 자동으로 생성하여 request객체에 넣어주기 때문에
그 객체를 불러오는 것을 생성이라고 한다.
1. HttpRequest.getSession();
2. HttpRequest.getSession(boolean);
** SessionID일치 Session이 없을 경우
- boolean값에 따라 true : 객체생성, false : null값 반환
@WebServlet("/session")
public class SessionHandlerSevlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String firstName = request.getParameter("firstName");
String lastName = request.getParameter("lastName");
System.out.println("firstName : " + firstName);
System.out.println("lastName : " + lastName);
HttpSession session = request.getSession();
/* 세션은 강제로 만료 시킬 수 있는 기능도 있지만 만료 시간을 성정해주는 것이 좋다,
* 설정된 기본 시간은 30분 이며 필요에 따라 늘리거나 줄이면 된다.*/
System.out.println("session default 유지 시간 : " + session.getMaxInactiveInterval());
session.setMaxInactiveInterval(60 * 10); //세션 만료 시간을 10분으로 설정
System.out.println("변경 후 session 유지 시간 : " + session.getMaxInactiveInterval());
/* 세션은 브라우저 당 한개 씩 고유한 아이디를 가지고 하나의 인스턴스를 이용한다.
* 매번 반복적인 요청 시 동일한 session id를 리턴한다*/
System.out.println("session id : " + session.getId());
/* 세션은 redirect를 해도 값을 유지할 수 있는 request보다 더 넒은 범위의 공유 영역
* 세션에 값을 담을 때 setAttribute(String key, Object value) 형태로 담을 수 있고,
* 값을 꺼낼 때에는 key를 이용해서 getAttribute(key)를 이용해 꺼내게 된다.
* */
session.setAttribute("firstName" , firstName);
session.setAttribute("lastName" , lastName);
response.sendRedirect("redirect?test=hello");
}
}
Session설정 / 호출
Session 생성(HttpServletRequest에 있음)
HttpSession 세션명=HttpServletRequest.getSession();
** client가 보낸 SessionID값이 있으면 관련 객체 호출 SessionID나 관련객체가 없으면 새로운 객체
생성 생성된 Session값 설정
세션명.setAttribute(“이름”,”값(Obj)”); //세션데이터 설정
세션명.setMaxInactiveInterval(숫자); //세션유지시간설정
생성된 Session 호출 HttpSession 세션명=HttpServletRequest.getSession();
세션명.getAttribute(“이름”); // 데이터불러오기
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* 쿼리 스트링을 통한 데이터 전송*/
String test = request.getParameter("test");
System.out.println("test : " + test);
String firstName = request.getParameter("firstName");
String lastName = request.getParameter("lastName");
System.out.println("firstName : " + firstName);
System.out.println("lastName : " + lastName);
/* 앞서 작성한 페이지와 동일한 세션아이디를 반환한다. */
HttpSession session = request.getSession();
System.out.println("redirect 페이지 session id : " + session.getId());
/* 세션에 담긴 모든 Attribute 키 목록을 반환 받을 수도 있다. */
Enumeration<String> sessionName = session.getAttributeNames();
while(sessionName.hasMoreElements()) {
System.out.println(sessionName.nextElement());
}
/* 동일한 아이디를 가진 세션에서는 setAttribute한 값을 getAttribute로 꺼내올 수 있다. */
firstName = (String) session.getAttribute("firstName");
lastName = (String) session.getAttribute("lastName");
/* 꺼내온 값을 이용해서 페이지에 응답용 html 전송 */
StringBuilder responseText = new StringBuilder();
responseText.append("<!doctype html>\n")
.append("<html>\n")
.append("<head>\n")
.append("</head>\n")
.append("<body>\n")
.append("<h3>your first name is ")
.append(firstName)
.append(" and last name is ")
.append(lastName)
.append("<h3>\n")
.append("</body>\n")
.append("</html>\n");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print(responseText.toString());
out.flush();
out.close();
}
}
'백엔드 과정 > Servlet' 카테고리의 다른 글
Servlet 문제 풀이 (0) | 2022.03.15 |
---|---|
[Servlet] file.io (0) | 2022.03.07 |
[Servlet] sendRedirect VS RequestDispatcher (0) | 2022.03.06 |
[Servlet] Response 응답 확인하기 (0) | 2022.03.06 |
[Servlet] GET/POST 방식에 따른 서블릿 메소드 (0) | 2022.03.05 |