JSP
#2 JSP Project 03(CURD게시판) - 기본개념03(쿠키/세션)
H-V
2021. 8. 15. 16:08
유투버 'ITTHISGO. IT 이거라도 알고 가자!' 님의 강의 참조
1) 쿠키
- 쿠키는 서버에서 생성하고 브라우저에 응답하여 저장하도록 하는 데이터이며 브라우저는 저장된 쿠키를 해당사이트에 어떠한 자원을 요청시에 항상 포함하여 전송
- 브라우저가 어떠한 사이트를 이용하면서 짧게 유지할 값이 있다면 '쿠키'를 사용
<body>
<%
Cookie cookie1 = new Cookie("name", "HGD");
Cookie cookie2 = new Cookie("age", "20");
System.out.println("name:"+cookie1.getValue());
System.out.println("age:"+cookie2.getValue());
%>
쿠키가 생성 되었습니다.
</body>
response.addCookie(cookie1);
response.addCookie(cookie1);
- addCookie를 통해 응답시에 쿠키를 추가 할 수 있고 추가를 통해 브라우저에 저장이 가능하다
- 즉 저장된 후 새로고침 혹은 웹브라우저가 이 서버에 재접속을하면 쿠키로 저장된 값이 계속 남게되고 식별 된다.
예제1
- 서버에서 쿠키를 생성(new cookie)하고 response.addCookie 를 통해서 브라우저에 저장시키는것을 기억하자
- 순서를 잘 기억해야한다
1. 브라우저에서 서버로 자원을 요청 (index.jsp)
2. 서버에서 쿠키 생성 및 응답에 포함 (index.jsp의 Cookie 객체들)
3. 브라우저는 응답받은 쿠키를 저장소에 저장 (검사페이지에서 확인가능)
4. 응답시에 해당사이트로 쿠키를 함께 전송
5. 요청에서 쿠키정보 확인 가능
<body>
<h2>쿠키 목록</h2>
<%
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
%>
<%= cookie.getName()%> : <%= cookie.getValue()%><br>
<% } %>
</body>
- 따로 쿠키 유지시간을 지정하지 않았기 때문에 종료를하지않으면 쿠키는 계속 살아있다(세션이 사라질때까지 쿠키시간은 유효)
예제2 - 쿠키 수정
<body>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
for (int i=0; i<cookies.length; i++){
if(cookies[i].getName().equals("name")){
//여기서 아예 다시 setCookie를 시키는 것 (new Cookie = 새 객체)
Cookie cookie = new Cookie("name","KKA");
response.addCookie(cookie);
}
}
}
%>
</body>
예제3 - 쿠키 삭제
<body>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
for (int i=0; i<cookies.length; i++){
if(cookies[i].getName().equals("name")){
//여기서 아예 다시 setCookie를 시키는 것 (new Cookie = 새 객체)
Cookie cookie = new Cookie("name","");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}
%>
</body>
- 쿠키 유효 시간을 정해 쿠키를 날릴 수 있다
- 자주 쓰이는 쿠키 함수
- setPath() - URL위치를 조절하여 쿠키 생성
- setMaxAge() - 쿠키 유효시간 설정(쿠키는 유효시간이 지나면 다시 사용되지 못함) - 브라우저 닫혀도 유지
예제 3 - 쿠키를 이용하여 아이디 기억하기
*loginForm.jsp
<form action ="loginProc.jsp">
<input type="text" name="id" placeholder="ID"><br>
<input type="password" name="pw" placeholder="PASSWORD"><br>
Remember your ID<input type="checkbox" name="remember" value="chk"><br>
<input type="submit" value="Login">
</form>
<%
//1. 요청 파라미터 들고오기
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String rmb = request.getParameter("remember");
System.out.println("id:"+id);
System.out.println("pw:"+pw);
System.out.println("remember:"+rmb);
- 리멤버 여부에따라 값을 읽어볼수있다!
<body>
<%
//1. 요청 파라미터 들고오기
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String rmb = request.getParameter("remember");
System.out.println("id:"+id);
System.out.println("pw:"+pw);
System.out.println("remember:"+rmb);
//2. 들고온 파라미터 유효검사 -> 아이디 기억여부에 따라 쿠키 생성하여 응답, 쿠키 1시간 유지
if (id.equals(pw)){
System.out.println("Login Success");
if(rmb != null){
Cookie rmbId = new Cookie("rbm", id);//리멤버 쿠키가 존재하면 체크박스 채우기
rmbId.setMaxAge(60 * 60);
response.addCookie(rmbId); //쿠키와 같이 응답
System.out.println("ID/COOKIE SAVED");
} else {
Cookie rmbId = new Cookie("rbm", id);//리멤버 쿠키가 존재하면 체크박스 채우기
rmbId.setMaxAge(0);
response.addCookie(rmbId); //쿠키와 같이 응답
System.out.println("ID/COOKIE UNSAVED");
}
response.sendRedirect("login.jsp");
}
//3. 같지않으면 다시 로그인 페이지
else {
System.out.println("Login Failed");
response.sendRedirect("index.jsp");
}
%>
</body>
- 리멤버 체크박스 기억하기는 서버에서 진행되어야 하므로 index.jsp 에 코드 구성
- checked 속성을 사용할 줄 알아야한다!!
<body>
<%
String checked = "";
String id = "";
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for (int i=0; i<cookies.length; i++){
if(cookies[i].getName().equals("rbm")){
checked = "checked";
id = cookies[i].getValue();
}
}
}
%>
<form action ="loginProc.jsp" method="post">
<input type="text" name="id" placeholder="ID" value="<%= id %>"><br>
<input type="password" name="pw" placeholder="PASSWORD"><br>
Remember your ID<input type="checkbox" name="remember" value="chk" <%= checked %>><br>
<input type="submit" value="Login">
</form>
- 저장되어있는 쿠키들을 포문을 통해서 글고오고 쿠키들중 이름이 " "이하와 같으면 checked를 "checked"로 바꾸고 쿠키의 밸류값을 id에 줘서 input에 적용하면 된다
2) 세션
- JSP로 최초 작업시 세션은 자동으로 만들어진다. 세션은 브라우저를 기억한다. 새로운 브라우저가 서버에 접근시에 자동으로 세션이 부여가되고 서버는 그것을 통해서 어느 브라우저가 어떻게 들어왔는지 식별한다
- 세션도 쿠키와 마찬가지로 삭제/시간 지정이 가능하다
session.invalidate() - 세션값을 날리는 함수로 주로 로그아웃에 많이 쓴다
session.setMaxInactiveInterval() - 유효 시간 설정함수로 주로 은행어플등에 많이 쓴다(web.xml에서도 설정 가능) - 세션이 내장객체로 존재하는이유는 브라우저를 식별만하는것이아닌 브라우저와 관계된 데이터를 서버에 저장하기위해 사용
<body>
<form action="sessionSave.jsp">
<input type="text" name="data">
<input type="submit" value="Send">
</form>
</body>
*sessionSave.jsp
<%
String data = request.getParameter("data");
session.setAttribute("save", data); // 세션에 저장
response.sendRedirect("sessionInfo.jsp");
%>
*sessionInfo.jsp
<body>
세션 요청자 : <%= session.getId() %><br>
세션 응답 데이터: <%= session.getAttribute("save") %>
</body>
- 클라이언트가 데이터요청시에 세션으로 식별후 request.getParameter로 요청한 데이터를 받아서 처리후에 다시 세션에 데이터를 넣어서(session.setAttribute) 응답한다
- 그 데이터를 받기위해서는 session.getAttribute("")
- 데이터를 이렇게 서버쪽에 저장해놓고 쓸 수 있다. 주로 로그인 성공에 쓴다
예제 - 세션으로 로그인 개념 잡기
- 로그인 요청 -> 성공시 세션에 ID부여 -> 리다이렉트로 로그인성공페이지로 이동
- 로그인 되어 있는 상태에서 다시 로그인이나 로그인 처리 페이지로하면 로그인성공페이지로 이동
- 로그아웃버튼을 누르면 세션 잃고 다시 로그인하라고 만들기
*loginProc.jsp
....
if (id.equals(pw)){
System.out.println("Login Success");
session.setAttribute("loginId", id);
....
*index.jsp
<body>
<%
String loginId = (String)session.getAttribute("loginId");
if(loginId != null){
System.out.println("로그인이 이미 되어 있습니다.");
response.sendRedirect("loginSuccess.jsp");
- loginProc에서 로그인 성공하면 데이터를 세션에 부여(session.setAttribute)하여 sendRedirect페이지로 이동하게되고 다시 로그인 페이지로 가려고하면 index.jsp에서 부여된 데이터를 확인(session.getAttribute)하고 유효검사 유무에따라 페이지가 갈리게 된다. 즉 세션 데이터가 로그인시에 입력한 데이터와 같으면 '로그인이 이미 되어 있습니다'라고 알려주게 되는 개념
- 로그아웃과 동시에 세션 날리기
<a href="logout.jsp"><button>로그아웃</button></a>
*logout.jsp
<%
System.out.println(session.getAttribute("loginId") + "이 로그아웃 했습니다");
session.invalidate();
response.sendRedirect("index.jsp");
%>
- 세션이 invalidated 되면서 로그인을 다시 하게 만든다