브라우저는 http 프로토콜 통신규약으로 서버와 통신하게 되는데, 이때 페이지를 이동할 때마다 stateless 상태이다.
즉, 연결을 유지하는 것이 아니라, 클라이언트와 서버가 보내고 받고를 반복하는 것이라고 할 수있다.
먼저, 브라우저에서 서버로 정보를 보내는 방법을 알아보자.
- login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" encType="UTF-8">
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pw"><br>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
<input type="hidden" name="user_address" value="서울시 동작구" />
<input type="hidden" name="user_email" value="dongpani@gmail.com" />
<input type="hidden" name="user_hp" value="010-1234-1212" />
</form>
</body>
</html>
- input 태그의 hidden 속성을 사용하여 값을 서블릿에 전송한다.
- LoginServlet.java
package sec01.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
public void init(ServletConfig config) {
System.out.println("init 메서드 호출");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
String user_address = request.getParameter("user_address");
String user_email = request.getParameter("user_email");
String user_hp = request.getParameter("user_hp");
String data = "안녕하세요!<br> 로그인하셨습니다.<br><br>";
data += "<html><body>";
data += "아이디 : " + user_id;
data += "<br>";
data += "비밀번호 : " + user_pw;
data += "<br>";
data += "주소 : " + user_address;
data += "<br>";
data += "email : " + user_email;
data += "<br>";
data += "휴대 전화 : " + user_hp;
data += "</html></body>";
out.print(data);
}
@Override
public void destroy() { // 객체가 소멸될 때 호출
System.out.println("destroy 메서드 호출");
}
}
- 전송받은 파라미터를 출력한다.


쿠키
쿠키란 사용자 정보를 클라이언트PC 에 저장하는 것을 의미하며, 이는 사용자가 쿠키정보를 허용할지 선택할 수 있다.
외부에 노출되는 값이므로 보안에 취약하다는 단점이 있다.
사용자 PC에 저장된 쿠키 확인하기 (크롬)

쿠키 API
- 서버에서 쿠키 생성하기.
package sec02.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;
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("/set")
public class SetCookieValue extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Date d = new Date();
Cookie c = new Cookie("cookieTest", URLEncoder.encode("JSP프로그래밍입니다.", "utf-8"));
c.setMaxAge(24 * 60 * 60);
// c.setMaxAge(-1); // 세션 쿠키 (브라우저(
response.addCookie(c);
out.println("현재시간:" + d);
out.println("<br> 문자열을 Cookie에 저장합니다." );
}
}
- 쿠키 출력하기
package sec02.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
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("/get")
public class GetCookieValue extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie[] allValues = request.getCookies();
for(int i=0; i < allValues.length; i++) {
if(allValues[i].getName().equals("cookieTest")) {
out.println("<h2> Cookie 값 가져오기 : "+ URLDecoder.decode(allValues[i].getValue(), "utf-8") + " </h2>");
}
}
}
}



하루동안 팝업창 보지 않기
- popupTest.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>자바스크립트에서 쿠키 사용</title>
<script>
window.onload = pageLoad;
function pageLoad() {
noShowPop = getCookieValue();
console.log('noShowPop: ', noShowPop);
if(noShowPop != 'true') {
window.open("popUp.html","pop","width=400,height=500,history=no,resizable=no,status=no,scrollbars=yes,menubar=no");
}
}
// 쿠키 읽어오는 함수
function getCookieValue() {
var result = 'false';
// 쿠키 여부 확인
if(document.cookie != '') {
cookie = document.cookie.split(';');
for(var i=0; i < cookie.length; i++) {
element = cookie[i].split('=');
value = element[0];
value=value.replace(/^\s*/,'');
if(value == 'noShowPop') {
result = element[1];
}
}
}
return result;
}
function deleteCookie() {
document.cookie = 'noShowPop=' + 'false' + ';path=/; expires=-1';
}
</script>
</head>
<body>
<form>
<input type="button" value="쿠키삭제" onClick="deleteCookie()" />
</form>
</body>
</html>
- 브라우저가 로드되자마자 쿠키를 읽어옴.
- 쿠키 값에 따라 팝업 노출/미노출
- popUp.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
function setPopUpStart(obj){
if(obj.checked == true){
var expireDate = new Date();
expireDate.setMonth(expireDate.getMonth() + 1);
document.cookie ="noShowPop=" +"true" + ";path=/; expires=" + expireDate.toGMTString();
window.close();
}
}
</script>
<title>Insert title here</title>
</head>
<body>
알림 팝업창입니다.
<br><br><br><br><br><br><br>
<form>
<input type=checkbox onClick="setPopUpStart(this)" >오늘 더 이상 팝업창 띄우지 않기
</form>
</body>
</html>
- "오늘 더 이상 팝업창 띄우지 않기" 탭을 누르면 쿠키 생성

세션
SESSION 은 쿠키와는 다르게 클라이언트정보가 사용자PC가 아닌, 서버에 저장된다. 그렇기에 쿠키보다는 보안성이 조금 더 높다는 장점이 있다.
세션생성과정
- (최초접속)브라우저가 서버에 들어왔다고 신호를 보낸다.
- 서버에서는 브라우저에게 세션키를 보내준다.
- 브라우저는 서버에게 받은 세션키를 자기자신의 "메모리"에 저장해둔다.
- 브라우저당 하나의 세션ID를 생성한다.
세션아이디로 로그인 바인딩
- login2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" encType="UTF-8">
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pw"><br>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
</form>
</body>
</html>
- SessionTest4.java
package sec03.ex04;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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("/login")
public class SessionTest4 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
if(session.isNew()) { // 최초접속 시
if(user_id != null) {
session.setAttribute("user_id", user_id);
out.println("<a href='login'>로그인 상태 확인</a>");
}else {
out.println("<a href='login2.html'> 다시 로그인 하세요!! </a>");
session.invalidate();
}
}else {
user_id = (String) session.getAttribute("user_id");
if(user_id != null && user_id.length() != 0) {
out.print("안녕하세요 " + user_id + "님!!!");
} else {
out.print("<a href='login2.html'> 다시 로그인 하세요!! </a>");
session.invalidate();
}
}
}
}



쿠키가 차단 되었을 때
브라우저에서 쿠키가 차단되었다면, 쿠키와 세션모두 사용할 수 없다. 그럴 때는 브라우저에서 세션ID를 받는 것이 아닌,반대로 서버에서 브라우저로 세션ID를 부여해야한다.

- SessionTest
package sec04.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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("/login")
public class SessionTest5 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
if(session.isNew()) { // 최초접속 시
if(user_id != null) {
session.setAttribute("user_id", user_id);
String url = response.encodeURL("login");
out.println("<a href=" + url + ">로그인 상태 확인</a>");
}else {
out.println("<a href='login2.html'> 다시 로그인 하세요!! </a>");
session.invalidate();
}
}else {
user_id = (String) session.getAttribute("user_id");
if(user_id != null && user_id.length() != 0) {
out.print("안녕하세요 " + user_id + "님!!!");
} else {
out.print("<a href='login2.html'> 다시 로그인 하세요!! </a>");
session.invalidate();
}
}
}
}
- response 객체의 encodeURL 메서드로 브라우저로 jsessesionid을 보낸다.

세션을 이용한 로그인 (데이터베이스 연동)
데이터베이스에 저장된 회원정보를 조회에 로그인하는 기능을 만들어보자.
login3.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" encType="UTF-8">
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pwd"><br>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
</form>
</body>
</html>
LoginServlet
package sec05.ex01;
import java.io.IOException;
import java.io.PrintWriter;
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("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String user_id = request.getParameter("user_id");
String user_pwd = request.getParameter("user_pwd");
MemberVO memberVO = new MemberVO();
memberVO.setId(user_id);
memberVO.setPwd(user_pwd);
MemberDAO dao = new MemberDAO();
boolean result = dao.isExisted(memberVO);
if(result) {
HttpSession session = request.getSession();
session.setAttribute("isLogon", true);
session.setAttribute("login.id", user_id);
session.setAttribute("login.pwd", user_pwd);
out.print("<html><body>");
out.print("안녕하세요 " + user_id + "님!!!<br>");
out.print("<a href='show'>회원정보보기</a>");
out.print("</body></html>");
}else {
out.print("<html><body>회원 아이디가 틀립니다.");
out.print("<a href='login3.html'> 다시 로그인하기</a>");
out.print("</body></html>");
}
}
}
- 아이디와 패스워드를 입력하면 데이터베이스에서 회원정보를 조회해온다.
- 회원정보가 있다면 세션을 저장한다.
ShowMember
package sec05.ex01;
import java.io.IOException;
import java.io.PrintWriter;
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("/show")
public class ShowMember extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String id = "", pwd="";
Boolean isLogon = false;
HttpSession session = request.getSession(false);
// 세션 체크
if(session != null) {
isLogon = (Boolean)session.getAttribute("isLogon");
if(isLogon == true) {
id = (String)session.getAttribute("login.id");
pwd = (String)session.getAttribute("login.pwd");
out.print("<html><body>");
out.print("아이디: " + id+"<br>");
out.print("비밀번호: " + pwd+"<br>");
out.print("</body></html>");
}else {
response.sendRedirect("login3.html");
}
}else {
response.sendRedirect("login3.html");
}
}
}
- 브라우저에 저장된 세션이 있다면 사용자 아이디와 패스워드를 출력하고 없다면 다시 로그인페이지로 이동시킨다.
출처: 자바 웹을 다루는 기술
'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글
JSP 액션태그와 Bean (0) | 2020.02.07 |
---|---|
서블릿 스코프, URL패턴, 필터 (0) | 2020.01.30 |
서블릿 리다이렉트 와 바인딩 (0) | 2019.12.26 |
서블릿과 DB 연동 (2) | 2019.12.19 |
서블릿 Response객체 (0) | 2019.12.15 |