Rylah's Study & Daily Life
12. JSP - Cookie, Session 본문
1. 쿠키(Cookie)
먹는 쿠키가 아니고 HTTP 프로토콜에 대한 쿠키이다.
HTTP 프로토콜은 상태가 없다. 상태를 기억하지 않는다는 말이다. 웹 브라우저에 대한 응답을 하고 나면 해당 클라이언트와의 연결을 지속하지 않는다.
HTTP 프로토콜은 상태에 대한 지속적인 연결 또한 존재하지 않는다. 그래서 이러한 부분을 해결하기 위해 웹서버에서 웹 브라우저의 정보를 저장한다. 이후에는 웹 브라우저 요청에 포함되어 있는 정보와 서버에 저장되어 있는 각각의 정보를 비교해서 동일한 브라우저에서 온 요청인지 판단한다.
쿠키는 상태가 없는 프로토콜을 위해 상태를 지속시키기 위한 방법이다.
쿠키는 웹브라우저의 정보를 웹 브라우저(클라이언트)에 저장하므로 이후에 서버로 전송되는 요청은 쿠키가 가지고 있는 정보가 같이 포함되서 전송된다. 이 때 웹 서버는 쿠키가 포함되어 있는지 읽어서 판단하게 된다.
웹 브라우저에서 쿠키가 저장되어 접속한 사용자의 정보가 유지되는 것이 이러한 이유이다.
쿠키는 웹 사이트를 접속할 때 생성되는 정보를 담은 임시파일이다. 쿠키는 보통 4kb 이하의 크기로 생성된다.
보통 해당 사이트에 접속할때 아이디와 패스워드를 기억하고 절차 없이 빠르게 접속하기 위함이다.
하지만 개인 정보가 기록되기 때문에 개인 사생활 및 정보 노출에 대한 문제점이 있다. 쿠키를 통한 개인정보 유출 문제가 그것이다.
이를 해소하기 위해 쿠키 거부 기능이 추가 되었고, 쿠키를 거부하게 되면 지속적인 연결을 수행할 수 없다.
쿠키 이론은 이정도로 하고 구체적인 것은 세션에서 알아보기로 하자.

- 쿠키를 사용할 때에는 javax.servlet.http 패키지에 있는 Cookie 클래스를 이용하며, 서블릿에서 만들어져 클라이언트의 브라우저에 의해 저장된다.
- 쿠키 안에는 각각의 브라우저를 판별할 수 있는 정보가 포함되어 있고, 이렇게 쿠키가 클라이언트에 한번 저장이 된 후에 다시 서버로 요청할 떄는 클라이언트에 저장된 쿠키 만의 정보가 요청에 포함되어져 서버로 전송된다.
- Cookie 클래스를 사용한 쿠키 생성
| 1 | Cookie cookie = new Cookie(String name, String value); | cs | 
- 쿠키를 생성한 후에는 반드시 response 객체의 addCookie() 메소드를 사용해서 쿠키를 추가해야 한다.
| 1 | response.addCookie(name); | cs | 
- 쿠키 생성 후 쿠키의 이름에 대응하는 값을 새롭게 지정할 때 setValue() 메소드를 사용한다.
| 1 | cookie.setValue(newValue); | cs | 
쿠키 생성
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%     String cookieName = "id";     Cookie cookie = new Cookie(cookieName, "hongkd");     cookie.setMaxAge(60 * 2);     response.addCookie(cookie); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>쿠키 생성</title> </head> <body>     <h2>쿠키를 생성하는 페이지</h2>     "<%=cookieName %>"쿠키가 생성되었습니다. <br>     <form method="post" action="useCookie.jsp">         <input type="submit" value="생성된 쿠키 확인">     </form> </body> </html> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>웹 브라우저에 저장된 쿠키 사용하기</title> </head> <body>     <h2>웹 브라우저에 저장된 쿠키 사용하기</h2>     <%         Cookie[] cookies = request.getCookies();         if (cookies != null) {             for (int i = 0; i < cookies.length; ++i) {                 if (cookies[i].getName().equals("id")) {     %>                     쿠키의 이름은 "<%=cookies[i].getName() %>"이고                     쿠키의 값은 "<%=cookies[i].getValue() %>"입니다.     <%                 }             }         }     %> </body> </html> | cs | 


JavaBean
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package ch12.member; import java.sql.Timestamp; public class LogonDataBean {     private String id;     private String passwd;     private String name;     private Timestamp reg_date;     public String getId() {         return id;     }     public void setId(String id) {         this.id = id;     }     public String getPasswd() {         return passwd;     }     public void setPasswd(String passwd) {         this.passwd = passwd;     }     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     public Timestamp getReg_date() {         return reg_date;     }     public void setReg_date(Timestamp reg_date) {         this.reg_date = reg_date;     } } | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | package ch12.member; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; public class LogonDBBean {     private static LogonDBBean instance = new LogonDBBean();     public static LogonDBBean getInstance() {         return instance;     }     private LogonDBBean() {     }     private Connection getConnection() throws Exception {         Context initCtx = new InitialContext();         Context envCtx = (Context) initCtx.lookup("java:comp/env");         DataSource ds = (DataSource) envCtx.lookup("jdbc/basicjsp");         return ds.getConnection();     }     public void insertMember(LogonDataBean member) throws Exception {         Connection conn = null;         PreparedStatement pstmt = null;         try {             String sql = "insert into member values (?, ?, ?, ?)";             conn = getConnection();             pstmt = conn.prepareStatement(sql);             pstmt.setString(1, member.getId());             pstmt.setString(2, member.getPasswd());             pstmt.setString(3, member.getName());             pstmt.setTimestamp(4, member.getReg_date());             pstmt.executeUpdate();         } catch (Exception ex) {             ex.printStackTrace();         } finally {             if (pstmt != null)                 try { pstmt.close(); } catch (SQLException ex) {}             if (conn != null)                 try { conn.close();    } catch (SQLException ex) {}         }     }     public int userCheck(String id, String passwd) throws Exception {         Connection conn = null;         PreparedStatement pstmt = null;         ResultSet rs = null;         String dbPasswd = "";         int x = -1;         try {             String sql = "select passwd from member where id = ?";             conn = getConnection();             pstmt = conn.prepareStatement(sql);             pstmt.setString(1, id);             rs = pstmt.executeQuery();             if (rs.next()) {                 dbPasswd = rs.getString("passwd");                 if (dbPasswd.equals(passwd)) {                     x = 1; // 인증 성공                 }                 else {                     x = 0; // 인증 실패                 }             }             else                 x = -1; // ID not Found         } catch(Exception ex) {             ex.printStackTrace();         } finally {             if (rs != null)                 try { rs.close(); } catch (SQLException ex) {}             if (pstmt != null)                 try { pstmt.close(); } catch (SQLException ex) {}             if (conn != null)                 try { conn.close();    } catch (SQLException ex) {}         }         return x;     } } | cs | 
회원 가입
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원가입</title> </head> <body>     <h2>회원가입</h2>     <form method="post" action="insertMemberPro.jsp">     아이디 : <input type="text" name="id" maxlength="50"> <br>     패스워드 : <input type="password" name="passwd" maxlength="16"> <br>     이름 : <input type="text" name="name" maxlength="10"> <br>     <input type="submit" value="회원가입">     <input type="reset" value="다시 입력">     </form> </body> </html> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <%@page import="ch12.member.LogonDBBean"%> <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <%@ page import="ch12.member.LogonDataBean" %> <% request.setCharacterEncoding("UTF-8"); %> <jsp:useBean id="member" class="ch12.member.LogonDataBean">     <jsp:setProperty name="member" property="*"/> </jsp:useBean> <%     member.setReg_date(new Timestamp(System.currentTimeMillis()));     LogonDBBean logon = LogonDBBean.getInstance();     logon.insertMember(member); %> <jsp:getProperty name="member" property="id"/>님 회원가입을 축하합니다. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html> | cs | 
쿠키 사용 로그인
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>로그인 폼</title> </head> <body>     <h2>Login Form Using Cookie</h2>     <form method="post" action="cookieLoginPro.jsp">         아이디 : <input type="text" name="id" maxlength="50"> <br>         패스워드 : <input type="password" name="passwd" maxlength="16"> <br>         <input type="submit" value="로그인">         <input type="button" value="회원가입"             onclick="location.href='insertMemberForm.jsp'">     </form> </body> </html> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <%     String id = "";     try {         Cookie[] cookies = request.getCookies();         if (cookies != null) {             for (int i = 0; i < cookies.length; ++i) {                 if (cookies[i].getName().equals("id"))                     id = cookies[i].getValue();             }             if (id.equals(""))                 response.sendRedirect("cookieLoginForm.jsp");         } else             response.sendRedirect("cookieLoginForm.jsp");     } catch(Exception ex) {} %> <meta charset="UTF-8"> <title>쿠키를 사용한 간단한 회원 인증</title> </head> <body> <b><%=id %></b>님이 로그인 하였습니다. <form method="post" action="cookieLogout.jsp">     <input type="submit" value="로그아웃"> </form> </body> </html> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ page import="ch12.member.LogonDBBean" %> <% request.setCharacterEncoding("UTF-8"); %> <!DOCTYPE html> <html> <head> <%      String id = request.getParameter("id");     String passwd = request.getParameter("passwd");     LogonDBBean logon = LogonDBBean.getInstance();     int check = logon.userCheck(id, passwd);     if (check == 1)     {         Cookie cookie = new Cookie("id", id);         cookie.setMaxAge(20 * 60);         response.addCookie(cookie);         response.sendRedirect("cookieMain.jsp");     } else if (check == 0) { %>     <script>         alert("비밀번호가 맞지 않습니다.");         history.go(-1);     </script>     <% } else { %>     <script>         alert("아이디가 맞지 않습니다.");         history.go(-1);     </script>     <%} %> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%     Cookie[] cookies = request.getCookies();     if (cookies != null) {         for (int i = 0; i < cookies.length; ++i) {             if (cookies[i].getName().equals("id")) {                 cookies[i].setMaxAge(0);                 response.addCookie(cookies[i]);             }         }     } %> <!DOCTYPE html> <html> <head> <script>     alert("로그아웃 되었습니다.");     location.href="cookieMain.jsp"; </script> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html> | cs | 
결과를 살펴보자.







이런식으로 활용할 수 있다.
2. 세션 (Session)
쿠키가 웹 브라우저에 사용자의 상태를 유지하기 위한 정보를 저장했다면, 세션은 웹서버 쪽의 웹 컨테이너에 상태를 유지하기 위한 정보를 저장하는 것을 말한다.
세션은 사용자의 정보를 유지하기 위해 javax.servlet.http 패키지의 HttpSession 인터페이스를 구현해서 사용한다.
쿠키는 웹 브라우저에 저장된 것을 웹 서버에서 쿠키 정보를 읽어서 사용하는데 이는 웹 서버에서 열어볼 수 있는 것이기에 보안상 문제가 될 수 있다.

세션에서 사용되는 메소드 리스트는 다음과 같다.
| Method : Return Type | Description | 
| getAttribute(java.lang.String name) : java.lang.Object | 세션 속성명이 name인 속성의 값을 Object 타입으로 리턴 속성명이 없을 경우 null 리턴 | 
| getAttributeNames() : java.util.Enumeration | 세션의 속성의 이름들을 Enumeration 객체 타입으로 리턴 | 
| getCreationTime() : long | 1970/01/01 0시 0초를 기준으로 세션이 생성된 시간까지 경과한 시간을 계산해서 밀리세컨드 값으로 리턴 | 
| getId() : java.lang.String | 세션에 할당된 고유 식별자를 String 타입으로 리턴 | 
| getMaxInactiveInterval() : int | 세션을 유지하기 위해 설정된 세션 유지시간을 int형으로 반환 | 
| invalidate() : void | 현재 생성된 세션을 무효화 | 
| removeAttribute(java.lang.String name) : void | 세션 속성명이 name인 속성을 제거한다. | 
| setAttribute(java.lang.String name, java.lang.Object value) : void | 세션 속성명이 name인 속성에 value를 할당한다. | 
| setMaxInactiveInterval(int interval) : void | 세션을 유지하기 위한 세션 유지 시간을 초단위로 설정 | 
사용자의 정보를 유지하기 위해서는 쿠키보다는 세션을 사용하는 것이 안정적이고 보안상 우위에 있다.
- 서버와 관련된 정보를 노출시키지 않기 위해 쿠키를 사용하는 것 보다 HttpSession 인터페이스의 세션을 통한 상태 관리가 더 효율적이다.
- 세션은 웹 브라우저당 1개씩 생성되어 웹 컨테이너에 저장된다.
- 세션 속성 설정은 session 객체의 setAttribute() 메소드를 사용해서 한다.
| 1 | session.setAttribute("id", "goat"); | cs | 
- 세션의 속성을 사용하려면 session 객체의 getAttribute() 메소드를 사용한다.
| 1 | String id = (String)session.getAttribute("id"); | cs | 
Object 이므로 사용시 실제 할당된 객체 타입으로 형변환을 해야한다.
- 세션의 속성을 삭제하려면 session 객체의 removeAttribute() 메소드를 사용한다.
| 1 | session.removeAttribute("id"); | cs | 
- 세션의 모든 속성을 삭제할 때는 Session 객체의 invalidate() 메소드를 사용한다.
| 1 | session.invalidate(); | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>세션 테스트</title> </head> <body>     <h2>세션 테스트</h2>     <form method="post" action="sessionTestPro.jsp">         아이디 : <input type="text" name="id" maxlength="50"> <br>         패스워드 : <input type="password" name="passwd" maxlength="16"> <br>         <input type="submit" value="정보입력">     </form> </body> </html> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>세션 속성 설정 및 사용</title> </head> <body>     <%         String id = request.getParameter("id");         String passwd = request.getParameter("passwd");         session.setAttribute("id", id);         session.setAttribute("passwd", passwd);     %>     id와 passwd 세션 속성을 설정했습니다.     id 속성의 값은         <%= (String)session.getAttribute("id") %> 이고 <br>     passwd 속성의 값은         <%= (String)session.getAttribute("passwd") %> 입니다. </body> </html> | cs | 


세션 사용 로그인 폼
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body>     <h2>Login Form</h2>     <form method="post" action="sessionLoginPro.jsp">         아이디 : <input type="text" name="id" maxlength="50"> <br>         패스워드 : <input type="password" name="passwd" maxlength="16"> <br>         <input type="submit" value="로그인">         <input type="button" value="회원가입"             onclick="location.href='insertMemberForm.jsp'">     </form> </body> </html> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%     String id = "";     try {         id = (String)session.getAttribute("id");         if (id == null || id.equals(""))             response.sendRedirect("sessionLoginForm.jsp");         else {     } %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>세션을 활용한 인증</title> </head> <body>     <b> <%=id %></b>님이 로그인 하셨습니다.         <form method="post" action="sessionLogout.jsp">             <input type="submit" value="로그아웃">         </form> </body> </html> <%     } catch(Exception ex) {         ex.printStackTrace();     } %> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ page import="ch12.member.LogonDBBean" %> <% request.setCharacterEncoding("UTF-8"); %> <%     String id = request.getParameter("id");     String passwd = request.getParameter("passwd");     LogonDBBean logon = LogonDBBean.getInstance();     int check = logon.userCheck(id, passwd);     if (check == 1) {         session.setAttribute("id", id);         response.sendRedirect("sessionMain.jsp");     } else if (check == 0) { %> <!DOCTYPE html> <html> <head>     <script>         alert("비밀번호가 맞지 않습니다.");         history.go(-1);     </script> <% } else { %>     <script>         alert("아이디가 맞지 않습니다.");         history.go(-1);     </script> <% } %> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html> | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <% session.invalidate(); %> <!DOCTYPE html> <html> <head>     <script>         alert("로그아웃 되었습니다.");         location.href="sessionMain.jsp";     </script> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html> | cs | 



새로고침해도 유지 된다,.



'Web Study > JSP' 카테고리의 다른 글
| Paging (0) | 2022.03.29 | 
|---|---|
| 11. JSP, DataBase (4) - DBCP API (0) | 2022.03.20 | 
| 11. JSP, DataBase (3) - JSP CRUD (0) | 2022.03.20 | 
| 11. JSP, DataBase (2) - Basic Query (0) | 2022.03.20 | 
| 11. JSP, DataBase (1) - MySQL (0) | 2022.03.20 | 
 
           
                   
                  