2019. 5. 16. 19:48ㆍJSP&Servlet
HTTP 프로토콜 특징
- HTTP 프로토콜은 기본적으로 클라이언트의 요청(request) 응답(response)로 구현됨.
- 서버에 요청을 하고 응답을 받으면 서버와의 통신이 끊기게 됨.
- HTTP는 비연결형 프로토콜이라고 한다.
장점
- 프로토콜을 직관적으로 이해하기 쉽고, 구현이 단순함
- 클라이언트의 요청에 대한 처리 결과를 응답으로 전송하고 나면 접속이 종료되기 떄문에 더 많은 클라이언트의 요청을 처리 할 수 있다.
단점
- 각 클라이언트 요청마다 새로운 접속이 이루어지기 떄문에 서버측에 네트워크 자원의 낭비가 적지만, 새로운 접속을 맺기 위해 발생하는 오버헤드 즉, 수행속도의 감소가 지속적으로 발생
- 동일한 클라이언트가 접속하더라도, 이전의 정보가 남아있지 않아서 클라이언트의 정보에 대한 비교가 불가능
STEP 01 . 쿠키
- HTTP 프로토콜은 상태가 없다. 즉 이전에 무엇을 했고, 지금 무엇을 했는지에 대한 정보를 갖고 있지 않는 특성을 가지고 있다. 즉, 웹 브라우저(클라이언트)의 요청에 대한 응답을 하고 나면 해당 클라이언트와의 연결을 지속하지 않는다.
- HTTP 프로토콜은 상태에 대한 지속적인 연결이 없다. 따라서 이런 부분을 해결하기 위해서 웹 서버 측에 웹 브라우저의 정보를 저장한 후 계속되는 웹브라우저의 요청 속에 포함되어 있는 웹 브라우저의 정보와 비교해서 동일한 웹 브라우저로부터 온 요청을 판단할 수 있다.
- 쿠키(Cookie)는 상태가 없는 프로토콜을 위해 상태를 지속시키기 위한 방법이다. 쿠키는 웹 브라우저의 정보를 웹 브라우저에 저장하므로, 이후에 서버로 전송되는 요청에는 쿠키가 가지고 있는 정보가 같이 포함돼 전송된다. 이때 웹 서버는 웹 브라우저의 요청 속에 포함되어 있을 쿠키를 읽어서 새로운 웹 브라우저인지 이전에 요청을 했던 웹 브라우저인지를 판단할 수 있다.
- 쿠키는 웹 사이트에 접속할 때 생성되는 정보를 담은 임시 파일이다. 일반적으로 쿠키는 4KB 이하의 크기로 생성된다. 이러한 쿠키의 목적은 원래 사이트에 접속한 사용자의 정보를 유지하거나, 사이트에 접속하는 사용자들이 해당 사이트에 쉽게 접속하기 위한 것이다.
- 어떤 웹 사이트를 처음 방문해서 로그인해 사용하고나면, 아이디와 패스워드를 기록한 쿠키가 만들어진다.그 다음 부터 해당 사이트에 접속하면 별도의 절차 없이 사이트에 빠르게 연결할 수 있게 된다. 쿠키는 이러한 목적으로 사용하기 위해 만들어진 것이다.
- 웹 사이트에 대한 정보 및 개인의 정보가 기록되기 때문에 개인의 사생활이나 정보를 침해할 소지가 있다는 문제점을 안고 있다. 이러한 보안상의 문제를 조금이나마 해소하기 위해서 웹 브라우저 자체에 쿠키 거부 기능이 추가되었다.
<첨부 http://itmore.tistory.com/entry/JSP-%EC%BF%A0%ED%82%A4Cookie-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%98%88%EC%8B%9C>
<첨부 http://hyeonstorage.tistory.com/114>
STEP 02 . 쿠키 사용하기
//쿠키 사용하기 Cookie 변수 = new Cookie(이름, 값); // 쿠키는 저장하는 값과 거기에 붙이는 이름이 세트로 되어 있음. //쿠키 저장하기 response.addCookie(변수);
//쿠키 받아오기 Cookie[] cookie = request.getCookie(); // 특정 쿠키만을 얻어오는 기능이 없음. 전체를 받아야 하기 떄문에 배열로 얻는다. //유효기간 설정하기 cookie.setMaxAge(초); // 쿠키가 언제까지 저장될지 설정. 설정하지 않을 경우 브라우저 종료시 그 시점에 쿠키 사라짐. |
/cookie/Ex01_Cookie.java
package cookie;
import java.io.IOException;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
@WebServlet("/ex01_cookie.do") public class Ex01_Cookie extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookie = req.getCookies(); String id = "";
if(cookie != null) { for(int i=0; i<cookie.length; i++) { if(cookie[i].getName().trim().equals("id")) { System.out.println(cookie[i].getValue()); id = cookie[i].getValue(); } } }
req.setAttribute("id", id);
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/view/ex01_cookie.jsp"); dispatcher.forward(req, resp); } } |
ex01_cookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Cookie</title> </head> <body> <form action="/WebTest/ex02_cookie.do" method="post"> ID : <input type="text" name="id" value="${id}" /> PW : <input type="password" name="pw" /> <input type="checkbox" name="saveid" /> 아이디 저장 <br> <input type="submit" value="전송" /> </form> </body> </html> |
/cookie/Ex02_Cookie.java
package cookie;
import java.io.IOException;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
@WebServlet("/ex02_cookie.do") public class Ex02_Cookie extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8");
String id = req.getParameter("id"); String pw = req.getParameter("pw"); String ch = req.getParameter("saveid"); System.out.println("id : " + id); System.out.println("pw : " + pw); if(id.equals("test") && pw.equals("1234")) {
System.out.println("로그인 성공");
if(ch != null && ch.trim().equals("on")) { Cookie cookie = new Cookie("id",id); resp.addCookie(cookie); System.out.println("성공"); } else { Cookie cookie = new Cookie("id", null); cookie.setMaxAge(0); resp.addCookie(cookie); System.out.println("실패"); } } else { System.out.println("로그인 실패"); }
resp.sendRedirect("/WebTest/ex01_cookie.do"); } } |
인코딩 처리
Cookie cookie = new Cookie("id",URLEncorder.encorde(id,"utf-8")
URLDecoder.decode(cookie[i].getValue(),"utf-8");
STEP 03 . 세션
- 세션은 쿠키와 다르게 사용자의 정보가 서버에 저장 됨.
- 사용자의 정보를 유지하기 위해서는 쿠기를 사용하는 것보다 세션을 사용한 웹 브라우저와 웹 서버의 상태 유지가 훨씬 안정적이고 보안상의 문제도 해결 가능.
<첨부 http://hyeonstorage.tistory.com/125>
/session/Ex01_Session.java
package session;
import java.io.IOException;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;
@WebServlet("/ex01_session.do") public class Ex01_Session extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/view/ex01_session.jsp"); dispatcher.forward(req, resp); } } |
ex01_session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>로그인 페이지</title> </head> <body> <h3>로그인</h3>
<form action="/WebTest/ex02_session.do" method="post"> <table> <tr> <td>이름 : </td> <td><input type="text" name="name" /></td> </tr> <tr> <td>아이디 : </td> <td><input type="text" name="id" /></td> </tr> <tr> <td>비밀번호 : </td> <td><input type="password" name="pw" /></td> </tr> <tr> <td colspan="2"> <input type="submit" value="전송" /> </td> </tr> </table> </form> </body> </html> |
/session/Ex02_Session.java
package session;
import java.io.IOException; import java.util.Enumeration;
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;
@WebServlet("/ex02_session.do") public class Ex02_Session extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
String name = req.getParameter("name"); String id = req.getParameter("id"); String pw = req.getParameter("pw");
session.setAttribute("name", name); session.setAttribute("id", id); session.setAttribute("pw", pw); session.setMaxInactiveInterval(360);
Enumeration<String> Enum = session.getAttributeNames();
while(Enum.hasMoreElements()) { System.out.println(Enum.nextElement()); }
System.out.println(session.getCreationTime()); System.out.println(session.getMaxInactiveInterval());
resp.sendRedirect("/WebTest/ex03_session.do"); } } |
/session/Ex03_Session.java
package session;
import java.io.IOException;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;
@WebServlet("/ex03_session.do") public class Ex03_Session extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
if(session == null) { resp.sendRedirect("/WebTest/ex01_session.do"); return; }
String name = session.getAttribute("name").toString(); String id = session.getAttribute("id").toString(); String pw = session.getAttribute("pw").toString();
req.setAttribute("name", name); req.setAttribute("id", id); req.setAttribute("pw", pw);
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/view/ex03_session.jsp"); dispatcher.forward(req, resp); } } |
ex03_session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>로그인 정보</title> </head> <body> <form action="/WebTest/ex04_session.do" method="post"> <table> <tr> <td>이름 : </td> <td>${name }</td> </tr> <tr> <td>아이디 : </td> <td>${id }</td> </tr> <tr> <td>비밀번호 : </td> <td>${pw }</td> </tr> <tr> <td colspan="2"><input type="submit" value="로그아웃" /></td> </tr> </table> </form> </body> </html> |
/session/Ex04_Session.java
package session;
import java.io.IOException;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;
@WebServlet("/ex04_session.do") public class Ex04_Session extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
session.invalidate();
resp.sendRedirect("/WebTest/ex01_session.do"); } } |