11 장. 세션과쿠키
세션의원리 세션의기본개념 1. 세션의활용 접속중인웹브라우저각각에대응하여서로다른세션이생성되고활용 2/35
1. 세션의활용 세션의원리 세션의생성시점과종료시점 session 생성시기임의의웹브라우저부터의첫번째요청을처리할때 session이생성되고관련타이머가동작한다. session 소멸시기 1) 세션타이머가만료 2) 코드상에서명시적으로세션소멸 한명의브라우저사용자에대해지속적으로관리해야하는데이터저장장소로서세션을활용 3/35
1. 세션의활용 세션의속성사용 [ 예제 11.1] jspbook\ch11\sessionattr.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 4/35 <%@ page contenttype="text/html;charset=utf-8" %> <html> <head><title> 세션속성사용하기 </title></head> <% session.setattribute("bookname", "jspbook"); // 세션에 BookName 및 Chapter 속성저장 session.setattribute("chapter", "11장"); %> <body> 세션에저장된속성정보 <hr/> <table border="1"> <tr> <th>bookname</th><td><%= session.getattribute("bookname") %></td>// BookName 속성가져오기 </tr> <tr> <th>chapter</th><td><%= session.getattribute("chapter") %></td> // Chapter 속성가져오기 </tr> </table> </body> </html>
세션의타임아웃 1. 세션의활용 가장최근에 session 객체에접근한시각및 session 이생성된시간을돌려주는메소드 session.getlastaccessedtime() session.getcreationtime() 세션만료와재생성 5/35
1. 세션의활용 세션의타임아웃 세션의유효시간설정방법 1 web.xml 활용 <?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee"... version="2.5">......... <session-config> <session-timeout>100</session-timeout> <!-- 분단위 --> </session-config></web-app> 세션의유효시간설정방법 2 session 객체의메소드활용 <% session.setmaxinactiveinterval(100 * 60); // 초단위 %> 6/35
2. 세션을활용한로그인처리구현 구글의로그인정보입력화면 7/35
2. 세션을활용한로그인처리구현 session 을사용한일반적인로그인기법처리과정 ➀ HTML 폼으로부터로그인정보를입력받는다. ➁ 로그인에성공하면 ( 즉, 데이터베이스에이미저장되어있는로그인정보와 HTML 폼으로부터입력받은정보가일치하면 ) session 기본객체의특정속성에데이터를기록한다. ➂ 이후각 JSP 및 Servlet 에서는선행작업으로서 session 기본객체에지정한특정속성이존재하는지검사한다. 그속성이존재한다면로그인이되어있는것으로간주한다. 4 사용자가로그아웃을할경우세션에저장된특정속성을지우거나 session.invalidate() 메소드를호출하여세션을종료한다. 세션이종료되면자연스럽게저장된속성도모두지워진다. 8/35
2. 세션을활용한로그인처리구현 웹어플리케이션의관리자정보저장하기 <?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> [ 예제 11.2] jspbook\web-inf\web.xml <!-- 아래의내용만삽입 --> <context-param> <param-name>masterid</param-name> <param-value>jspbook</param-value> </context-param> <context-param> <param-name>masterpassword</param-name> <param-value>112233</param-value> </context-param> <!-- 삽입끝 --> 9/35 </web-app>
2. 세션을활용한로그인처리구현 로그인처리예제 [ 예제 11.3-1] jspbook\ch11\login.html 01 02 03 04 05 06 07 08 09 10 11 12 13 <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title> 로그인 </title></head> </head> <body> 관리자 (Master) 로로그인하세요.<br/> <form action="loginprocess.jsp" method="post"> ID : <input type="text" name="id"><br/> Password : <input type="password" name="pw"><br/> <input type="submit" value=" 전송 "> </body> </html> 10/35
로그인처리예제 2. 세션을활용한로그인처리구현 [ 예제 11.3-2] jspbook\ch11\loginprocess.jsp 01 <%@ page contenttype="text/html;charset=utf-8" %> 02 <% 03 String storedid = application.getinitparameter("masterid"); 04 String storedpw = application.getinitparameter("masterpassword"); 05 06 String id = request.getparameter("id"); 07 String pw = request.getparameter("pw"); 08 if (id.equals(storedid) && pw.equals(storedpw)) { // 아이디와패스워드모두일치 09 session.setattribute("masterloginid", id); // 로그인성공을나타내는특정속성설정 10 %> 11 <html> 12 <head><title> 로그인처리 </title></head> 13 <body> 14 로그인에성공했습니다. <br/><br/> 15 <a href="logincheck.jsp"> 로그인체크 </a> 16 </body> 17 </html> 11/35
2. 세션을활용한로그인처리구현 로그인처리예제 [ 예제 11.3-2] jspbook\ch11\loginprocess.jsp 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <% } else if (id.equals(storedid)) { // 아이디일치 & 패스워드불일치 %> <script> alert(" 패스워드가다릅니다."); history.go(-1); </script> <% } else { // 아이디불일치 %> <script> alert(" 로그인 ID가다릅니다."); history.go(-1); </script> <% } %> 12/35
2. 세션을활용한로그인처리구현 로그인지속여부판단 [ 예제 11.3-3] jspbook\ch11\logincheck.jsp 01 02 03 04 05 06 07 08 09 10 <%@ page contenttype="text/html;charset=utf-8" %> <% // 세션의 MasterLoginID 속성읽어옴 String masterid = (String)session.getAttribute("MasterLoginID"); boolean islogin = false; if (masterid!= null) { // MasterLoginID에값이저장되어있으면로그인되어진상태 islogin = true; } %> <html> <head><title> 로그인여부검사 </title></head> 13/35
로그인지속여부판단 2. 세션을활용한로그인처리구현 11 <body> 12 <% 13 if (islogin) { 14 %> 15 아이디 "<%= masterid %>" 로로그인한상태 <br/><br/> 16 <a href="logout.jsp"> 로그아웃 </a> 17 <% 18 } else { 19 %> 20 로그인하지않은상태 21 <% 22 } 23 %> 24 </body> 25 </html> [ 예제 11.3-3] jspbook\ch11\logincheck.jsp 14/35
2. 세션을활용한로그인처리구현 로그아웃처리 [ 예제 11.3-4] jspbook\ch11\logout.jsp 01 02 03 04 05 06 07 08 09 10 11 <%@ page contenttype="text/html;charset=utf-8" %> <% session.invalidate(); // 세션의무효화 %> <html> <head><title> 로그아웃 </title></head> <body> 로그아웃하였습니다. <br/><br/> <a href="login.html"> 처음부터 </a> </body> </html> 세션을무효화하지않고다음과같이속성만제거해도된다. session.removeattribute("masterloginid"); 15/35
Servlet 에서세션의활용 2. 세션을활용한로그인처리구현 Servlet 에서는다음과같이명시적으로개발자가 session 객체를얻어와서활용 import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet { } public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { }............ HttpSession session = request.getsession();...... 16/35
Servlet 에서세션의활용 2. 세션을활용한로그인처리구현 session 기본객체를얻어오는메소드호출종류 메소드호출방법 request.getsession(true) 설명 항상 session 객체를새롭게생성하여리턴한 다. 기존의 session 객체는자동으로삭제된다. 현재 session 객체가존재한다면그 session request.getsession(false) 객체를그대로리턴해준다. 만약 session 객체 가존재하지않는다면 null 을리턴한다. 우선 session 객체의존재여부를확인하여기 존에 session 이없다면새롭게 session 객체를 request.getsession() 생성하여리턴해주고, 기존에존재하는 session 객체가있다면그대로그것을리턴해 준다. 17/35
3. 쿠키의활용 18/35 쿠키의원리 쿠키 (Cookie) 서버에서인터넷사용자의컴퓨터에설치하는작은기록정보파일 쿠키의활용방식 쿠키가웹브라우저측에저장이되면웹브라우저는해당서버로웹페이지를요청할때이쿠키를함께전송한다. 서버는전송받은쿠키를사용하여필요한데이터를읽어올수있다. 응답전송 서버에서브라우저로쿠키전송 한번만일어난다. 요청전송 일단웹브라우저에쿠키가저장되면쿠키가삭제되기전까지매번웹서버에전송된다. 쿠키의 3 단계동작방식
3. 쿠키의활용 쿠키의생성및활용 쿠키의구성요소 이름 - 각각의쿠키를구별하기위하여사용되는식별자 값 - 쿠키의이름과연관된내용 유효시간 - 쿠키의유지시간 도메인 - 쿠키와연관되는도메인 경로 - 쿠키를전송할요청경로 제한요소 <% Cookie cookie = new Cookie("cookieName", "cookievalue"); response.addcookie(cookie); %> 쿠키는하나의웹사이트당 20개의쿠키가저장될수있다. 한쿠키당데이터값으로 4096 바이트를넘을수없다. 19/35
3. 쿠키의활용 쿠키의생성및활용 쿠키객체에호출할수있는메소드 메소드 리턴타입 설명 getname() String 쿠키의이름을돌려준다. getvalue() String 쿠키의값을돌려준다. setvalue(string value) void 쿠키의값을지정한다. 쿠키가전송될서버의도메인을지정한다. 브라우저에 서서버쪽으로쿠키에대한요청전송을할때에는그 쿠키를 응답전송한 서버에게만 보낸다. 하지만 setdomain() 메소드를사용해서도메인정보를적절하 setdomain(string domain) void 게설정하면그도메인에속해있는다른서버에게도요청전송을하게된다. 그러므로같은도메인내의두서버에서쿠키를공유할수있다. 주의할점은파라미터값으로특정도메인이름을설정할때에는.google.com 과같이맨앞에점 (.) 을넣어야한다. 20/35 getdomain() String 쿠키가적용되는도메인을돌려준다.
3. 쿠키의활용 쿠키의생성및활용 쿠키객체에호출할수있는메소드 메소드리턴타입설명 쿠키를전송할경로를지정한다. 만약이설정을하 지않으면쿠키의응답전송시에활용했던경로및 setpath(string uri) void 그하위경로에대해서만요청전송이된다. 해당웹 어플리케이션의모든경로에대해요청전송이되게 끔하려면 setpath("/") 와같이설정해주면된다. getpath() String 쿠키가적용되는전송경로를돌려준다. 쿠키의유효시간을초단위로지정한다. -1 을입력 setmaxage(int time) getmaxage() void int 할경우웹브라우저를닫을때쿠키가함께삭제된다. 디폴트값은 -1 이다. 쿠키의유효시간을돌려준다. 쿠키가삭제되기전까지의시간을초단위로얻어올수있다. 21/35
3. 쿠키의활용 쿠키의생성예제 [ 예제 11.4-1] jspbook\ch11\createcookies.jsp 01 02 03 04 05 06 07 08 09 10 11 12 <%@ page contenttype="text/html;charset=utf-8" %> <%@ page import="java.net.urlencoder" %> <%@ page import="java.util.date" %> <% // name 및 date 쿠키생성 Cookie cookie = new Cookie("name", URLEncoder.encode("jspbook 쿠키테스트 ")); Cookie cookie2 = new Cookie("date", new Date().toString()); // date 쿠키생성 response.addcookie(cookie); // reponse 객체에쿠키추가 response.addcookie(cookie2); %> <html> <head><title> 쿠키생성 </title></head> <body> 22/35
쿠키의생성예제 13 14 쿠키이름 : <%= cookie.getname() %><br/> 15 쿠키값 : <%= cookie.getvalue() %><br/> 16 <br/> 17 쿠키이름 : <%= cookie2.getname() %><br/> 18 쿠키값 : <%= cookie2.getvalue() %> 19 20 <p><a href="getcookies.jsp">next Page to view the cookie value</a></p> 21 22 </body> 23 </html> 3. 쿠키의활용 [ 예제 11.4-1] jspbook\ch11\createcookies.jsp 23/35
3. 쿠키의활용 쿠키의활용방법 요청전송된쿠키얻어오기 Cookie[] cookies = request.getcookies(); "name" 인쿠키의값을변경하기위해서는다음과같이같은이름을지닌새로운 Cookie 객체를생성해서응답데이터에추가 Cookie[] cookies = new Cookie("name", URLEncoder.encode(" 새로운쿠키값 )); response.addcookie(cookie); 24/35
쿠키의활용방법 3. 쿠키의활용 쿠키값을변경하기전해당쿠키가존재하는지확인하는절차 Cookie[] cookies = request.getcookies(); if(cookies!= null && cookies.length > 0){ for(int i = 0; i < cookies.length; i++){ if(cookies[i].getname().equals("name")){ Cookie cookie = new Cookie("name", URLEncoder.encode(" 새로운쿠키값 )); response.addcookie(cookie); } } } 쿠키삭제방법 cookie.setmaxage(0); response.addcookie(cookie); 25/35
쿠키의활용예제 3. 쿠키의활용 [ 예제 11.4-2] jspbook\ch11\getcookies.jsp 01 <%@ page contenttype="text/html;charset=utf-8" %> 02 <%@ page import="java.net.urldecoder" %> 03 <html> 04 <head><title> 쿠키목록 </title></head> 05 <body> 06 쿠키목록 <br/> 07 <% 08 Cookie[] cookies = request.getcookies(); // request 객체로부터전송된모든쿠키를얻어온다. 09 if (cookies!= null && cookies.length > 0) { 10 for (int i = 0 ; i < cookies.length ; i++) { 11 %> // 쿠키의이름과값을얻어온다. 12 <%= cookies[i].getname() %>=<%= URLDecoder.decode(cookies[i].getValue()) %><br/> 13 <% 14 } 15 } else { 16 %> 17 전송받은쿠키가없습니다. 18 <% 19 } 20 %> 26/35 21 </body> 제11장
쿠키의활용예제 3. 쿠키의활용 [ 예제 11.4-3] jspbook\ch11\deletecookies.jsp 01 02 03 04 05 06 07 <%@ page contenttype="text/html;charset=utf-8" %> <%@ page import = "java.net.urlencoder" %> <% Cookie[] cookies = request.getcookies(); if (cookies!= null && cookies.length > 0) { for (int i = 0 ; i < cookies.length ; i++) { if (cookies[i].getname().equals("name")) { 08 09 cookies[i].setmaxage(0); response.addcookie(cookies[i]); // name 이름을지닌쿠키에대한삭제 10 } 11 } 12 13 14 15 16 17 } %> <html> <head><title> 쿠키삭제 </title></head> <body> name 쿠키만삭제하고 date 쿠키는남아있습니다. 18 19 <p><a href="getcookies.jsp">next Page to view the cookie value</a></p> 20 27/35 21 </body> 제11장
3. 쿠키의활용 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 쿠키의유효시간설정예제 [ 예제 11.4-4] jspbook\ch11\create1hourcookie.jsp <%@ page contenttype="text/html;charset=utf-8" %> <% Cookie cookie = new Cookie("cookieTime", "1 hour"); cookie.setmaxage(60 * 60); // 3600(60*60) 초 = 1시간 response.addcookie(cookie); %> <html> <head><title> 쿠키유효시간설정 </title></head> <body> 유효시간이 1시간인 cookietime 쿠키생성. <p><a href="getcookies.jsp">next Page to view the cookie value</a></p> </body> </html> 28/35
3. 쿠키의활용 쿠키의경로설정에대한일반적인방법 [Note] setpath() 메소드의일반적인활용법 일반적으로쿠키는웹어플리케이션에포함된대부분의 JSP, 서블릿에서공통으로사용되는경우가많기때문에대부분의쿠키는경로를 "/" 로지정한다. 즉, 생성된쿠키가 cookie 라면 cookie.setpath("/") 를호출하면된다. 29/35
4. 쿠키를활용한아이디기억하기구현 쿠키를활용한 ID 기억하기의전체절차 30/35
4. 쿠키를활용한아이디기억하기구현 쿠키를활용한 ID 기억하기예제 [ 예제 11.5-1] jspbook\ch11\login2.jsp 01 <%@ page contenttype="text/html;charset=utf-8" %> 02 <html> 03 <head><title> 로그인 </title></head> 04 <% 05 boolean isidshow = false; 06 String id = null; 07 Cookie[] cookies = request.getcookies(); // 요청전송된모든쿠키얻어오기 08 if (cookies!= null && cookies.length > 0) { 09 for (int i = 0 ; i < cookies.length ; i++) { 10 if (cookies[i].getname().equals("id")) { 11 isidshow = true; 12 id = cookies[i].getvalue(); 13 } 14 } 15 } 16 %> 17 <body> 18 관리자 (Master) 로로그인하세요.<br/> 31/35 제11장
4. 쿠키를활용한아이디기억하기구현 쿠키를활용한 ID 기억하기예제 [ 예제 11.5-1] jspbook\ch11\login2.jsp 19 <form action="loginprocess2.jsp" method="post"> 20 <% 21 if (isidshow) { 22 %> 23 ID : <input type="text" name="id" value="<%= id %>"> 24 <input type="checkbox" name="idstore" value="store" checked> 아이디기억하기 25 </input><br/> 26 <% 27 } else { 28 %> 29 ID : <input type="text" name="id"> 30 <input type="checkbox" name="idstore" value="store"> 아이디기억하기 </input><br/> 31 <% 32 } 33 %> 34 Password : <input type="password" name="pw"><br/> 35 <input type="submit" value=" 전송 "> 36 </body> 37 32/35 </html> 제11장
4. 쿠키를활용한아이디기억하기구현 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 쿠키를활용한 ID 기억하기예제 [ 예제 11.5-2] jspbook\ch11\loginprocess2.jsp <%@ page contenttype="text/html;charset=utf-8" %> <% String storedid = application.getinitparameter("masterid"); String storedpw = application.getinitparameter("masterpassword"); String id = request.getparameter("id"); String pw = request.getparameter("pw"); if (id.equals(storedid) && pw.equals(storedpw)) { // 아이디와패스워드모두일치 session.setattribute("masterloginid", id); // 로그인성공을나타내는특정속성설정 %> <html> <head><title> 로그인처리 </title></head> <body> 로그인에성공했습니다. <br/><br/> <a href="logincheck.jsp"> 로그인체크 </a> </body> </html> 33/35
4. 쿠키를활용한아이디기억하기구현 쿠키를활용한 ID 기억하기예제 [ 예제 11.5-2] jspbook\ch11\loginprocess2.jsp 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <% String IDStore = request.getparameter("idstore"); if (IDStore!= null && IDStore.equals("store")) { Cookie cookie = new Cookie("id", id); response.addcookie(cookie); out.println("<a href='login2.jsp'> 로그인화면다시보기 </a>"); } } else if (id.equals(storedid)) { // 아이디일치 & 패스워드불일치 %> <script> alert(" 패스워드가다릅니다."); history.go(-1); </script> <% 34/35
4. 쿠키를활용한아이디기억하기구현 32 33 34 35 36 37 38 39 40 쿠키를활용한 ID 기억하기예제 } else { // 아이디불일치 %> <script> alert(" 로그인 ID가다릅니다."); history.go(-1); </script> <% } %> [ 예제 11.5-2] jspbook\ch11\loginprocess2.jsp login2.jsp 를다시수행한모습 35/35