본문 바로가기

카테고리 없음

50일차 공부 Cookie, Session

어제에 이어서....

 

 

3) output.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>
	<%
		// 앞에서 넘겨준 데이터를 가져오
		Boolean result = (Boolean)request.getAttribute("result");
		if(result == true){
			out.println("회원 가입 성공");
		}else{
			out.println("회원 가입 실패");
		}
	%>
</body>
</html>

 

회원 가입은 성공했으나 비번이 URL에 보여진다.

 

4) 비밀 번호 입력란이 있는데 비밀번호가 주소 표시줄이 보이는 문제

=> form이 데이터를 POST 방식으로 전송해서 header에 숨겨야 한다.

=> form 태그에 method="post"를 추가

 

form 태그 안에 추가

비번이 보이지 않게는 되었으나

한글이 깨지게 된다

 

5) POST 방식으로 전송하면 기본 인코딩이 ISO-8859-1로 설정되서 한글이 깨진다.

=> 파라미터를 읽기 전에 request.setCharacterEncoding("utf-8")을 추가해야 한글이 깨지지 않는다.

이걸 작성해 주면 한글이 더이상 깨지지 않는다.

 

 

6) forwarding을 이용해서 결과 출력 페이지로 이동을 하게 되면 URL이 변경되지 않고 결과 페이지의 결과만 가져와서 출력

새로고침을 하게되면 처리부분이 다시 수행된다.

삽입, 삭제, 갱신 작업의 경우 결과 페이지로 이동을 할 때 포워딩을 하면 안되고 redirect를 해야한다.

 

process.jsp 파일에 아래부분을 처럼 수정 ( 포워딩 대신에 리다이렉트 사용)

 

	// 포워딩 하기
	/*
	RequestDispatcher dispatcher = request.getRequestDispatcher("output.jsp");
	dispatcher.forward(request, response);	
	*/
	
	// 리다이렉트 하기
	response.sendRedirect("output.jsp");

이렇게 해도 에러가 뜬다

 

8) redirect를 하게되면 request 객체가 새로 만들어진다.

redirect를 할 때는 request 객체에 데이터를 저장하면 안되고 session이나 application 객체에 데이터를 저장해야 한다.

 

=> process.jsp 파일의 데이터 저장부분을 수정한다.

 

	//3.결과를 저장하고 결과 페이지로 이동
	// request.setAttribute("result", result);
	// 포워딩이 아니라 리다이렉트로 이동할 것이라서 session에 데이터를 저장
	session.setAttribute("result", result);

 

=> output.jsp 파일의 데이터 가져오는 부분도 수정한다.

 

		// 앞에서 넘겨준 데이터를 가져오기 
		// Boolean result = (Boolean)request.getAttribute("result");
		Boolean result = (Boolean)session.getAttribute("result");

만약 결제창을 포워딩으로 작성했다면 포워딩할 때마다 결제가 될 수 있기 때문에 이런경우 redirect를 하는 것이다.

 

 

 

 

프로그램의 처리 흐름

요청(request - input) -> 처리(process) -> 결과 출력(response - output)

요청에서 처리하는 쪽으로 넘겨주는 데이터 : parameter

처리를 하고 결과를 출력하기 위해서 넘겨주는 데이터 : attribute

 

요청을 하는 방법

=> a 나 form 태그

=> javascript 코드

 

처리를 끝내고 결과를 출력하기 위한 방법

=> forwarding

=> redirect

 

 

 

** <jsp:include>

=> 다른 페이지를 태그가 위치한 부분에 포함시킬 때 사용하는 태그

<jsp:include page="포함할 페이지" flush="true" 또는 "false">

=> 페이지의 수행 결과를 포함

 

** <%@ include @>

=> 다른 페이지를 태그가 위치한 부분에 포함시킬 때 사용하는 태그

<%@ include file="포함할 파일" %>

=> 페이지의 코드를 포함

 

** 위의 두 태그의 목적

=> 동일한 코드가 여러 곳에서 사용이 되는 경우 하나만 만들어서 사용하기 위해서

=> 페이지의 수행 결과를 가져오면 페이지의 코드를 사용할 수 없지만 코드를 가져오면 사용할 수 있기 때문

 

** 웹 프로그래밍에서의 요청과 결과

1. Web Client Page에서 서버에게 요청하는 방법

1) 태그를 이용하는 방법

a 태그 이용 : href 속성에 요청할 URL을 설정하고 글자나 이미지를 배치해서 글자나 이미지를 누르면 서버에게 요청 (파라미터를 입력받아야 할때 사용)

form 태그 이용 : action 속성에 요청할 URL을 설정하고 form 안에 submit 타입의 버튼을 만들어서 버튼을 누르면 설정한 URL에 요청 (파라미터를 입력받을 필요가 없을 때 사용)

 

2. JavaScript를 이용한 방법

location.href="요청할URL" 대신에 window.location을 이용해도 동일한 결과

form객체.submit() : form안에서 submit 버튼을 누른 것과 동일한 효과

 

ajax 요청

location.reload() : 새로고침

history.go(인덱스), history.back(), history.forward()

 

2. Parameter 생성

=> parameter는 Web Client 에서 Web Server 에게 전송하는 데이터

=> parameter는 인코딩해서 전송해야 한다.

1) a 태그의 경우는 URL 뒤에 ?를 추가하고 이름=값&이름=값 의 형태로 직접 설정

 

2) form 태그 나 form태그의 submit()을 직접 호출하는 경우는 form안에 name 속성을 갖는 객체들의 값이 자동으로 parameter가 된다.

get 방식이면 URL 뒤에 붙여서 전송하고 post 방식이면 header에 감추어서 전송한다.

 

3) ajax의 경우는 데이터(FormData 객체를 만들어도 되고 {이름=값, 이름=값...}) 를 별도로 만들어서 전송

 

3. WebServer에서 파라미터 읽기

request 객체의 getParameter(String 리턴) 나 getParameterValues(String [] 리턴) 메소드를 이용

 

4. WebServer에서 결과를 전송

=> HTML이나 JSP : Web CLient에서만 사용 가능

=> json 이나 xml : 모든 Client에서 사용이가능

1) 서버에서 만든 결과를 attribute라고 한다.

2) attribute를 저장할 수 있는 객체

=> page : 현재 페이지에서만 공유 ( 잘안씀)

=> request : forwarding 했을 때만 공유

=> session : forwarding이나 redirect 모두 공유

=> application : 전체가 공유

 

3) 메소드

setAttribute(String name, Object value) : 저장

 

getAttribute(String name) : name에 해당하는 데이터를 Object 타입으로 리턴

=> Object 타입으로 리턴되기 때문에 출력만 할 때는 바로 출력하면 되지만 다른 용도로 사용할 때는 원래의 자료형으로 강제 형 변환을 해서 사용 (각 언어마다 사용법을 알아야 한다.)

 

setAttribute(String name, Object value) : 저장

 

removeAttribute(String name) : 삭제

 

4) 결과 페이지 이동

=> forwarding : URL을 변경하지 않고 결과 페이지를 가져오는 방식으로 이동

새로고침을 하면 결과 페이지가 다시 보여지는 것이 아니고 처리를 다시하고 결과를 재출력하는 형식

자신의 서버 이외의 요청을 못함(주로 조회 작업)

 

=> redirect : URL을 변경하고 결과 페이지로 이동

새로고침을 하면 결과만 다시 출력 (조회 작업이 아닐 때 redirect)

자신의 서버 이외의 요청을 할 수 있다.

 

** HTTP & HTTPS

=> HTTP 와 HTTPS는 연결에 사용된 어떠한 정보도 저장하지 않는다.

연결하고 나면 이전 상태를 알 수 없다.

=> 이전 요청과 연관된 작업을 연속해서 수행하는데 문제가 발생?

 

1. Cookie

=> 정보를 저장하고 클라이언트의 브라우저에 보관한 후 서버에게 요청이 발생할 때 마다 같이 전송해서 서버가 클라이언트의 상태를 알게 한 개체

 

2. HttpSession - session

=> 정보를 서버의 객체에 저장하고 사용자가 세션을 소멸시켜 달라고 하거나 브라우저를 종료할 때 까지 정보를 유지하는 개체

 

3. HTML5의 WebStorage, Web SQL, Indexed DB

=> 이전 상태를 사용은 하지만 서버가 알 필요가 없는 데이터들(id저장 등)을 Cookie 나 Session에 저장하는 것은 불필요한 행동

=> 브라우저에만 저장되고 서버에는 전송되지 않는 기술

여기까지는 저장의 개념들

 

4. HTML5의 Web Socket (저장이 아니고 연결을 유지)

=> Web 환경에서 TCP 통신을 하기 위한 기술

 

 

** Cookie

=> WebServer와 WebBrowser 간의 상태를 주소받는 방법 중의 하나

=> WebBrowser에 데이터를 저장하고 WebServer 에게 요청을 할 때 마다 전송되는 데이터

=> 클라이언트의 브라우저에 있기 때문에 클라이언트가 임의로 조작이 가능하기 때문에 보안이 필요한 데이터의 저장에는 적합하지 않다.

 

1. 쿠키의 동작 방식

=> 쿠키 생성

=> 쿠키를 저장

=> 쿠키를 전송

 

2. 구성요소 

=> 이름 : 구별하기 위한 요소

=> 값 : 실제 저장된 내용

=> 유효시간

=> 사용할 수 있는 도메인

=> 사용할 수 있는 경로

 

3. 생성과 저장

1) 생성 : new Cookie(String name, String nalue)

=> name 이나 value는 인코딩해서 저장해야 한다.

 

2) 저장 : response객체.addCookie(Cookie cookie)

 

4. Cookie의 메소드

=> String getName()

=> String getValue()

=> void setValue(String value)

=> void setMaxAge(int 유효시간)

 

5. 서버에서 모든 쿠키 읽기

Cookie [] request객체.getCookies()

 

6. Cookie의 수정과 삭제

=> Cookie를 수정하고자 할 때는 setValue 메소드 이용

=> Cookie를 삭제하는 메소드는 없어서 setMaxAge를 이용해서 유효시간을 0으로 설정하는 방식으로 삭제

 

7. Cookie를 이용한 아이디 저장

1) index.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>
	<form action="login.jsp" method="post">
		아이디<input type="text" name="id" required="required" size="40" /><br/>
		비밀번호 <input type="password" name="pw" required="required" size="40" /><br/>
		<input type="checkbox" name="idsave" value="save" />아이디 저장<br/>
		<input type="submit" value="로그인"/>	
	</form>
</body>
</html>

 

2) login.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>
	
	<%
		//파라미터 읽기
		request.setCharacterEncoding("utf-8");
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String idsave = request.getParameter("idsave");
		
		//idsave 의 값을 확인
		//value에 설정된 save가 나오면 체크를 한 것이고
		//null이면 체크를 안한 것임
		//System.out.println(idsave);
		
		//아이디 저장에 체크를 하지 않은 경우
		if(idsave == null){
			//id를 저장한 쿠키가 있으면 삭제
			
			//모든 쿠키를 전부 가져오기
			Cookie []  cookies = request.getCookies();
			//쿠키가 존재한다면
			if(cookies != null){
				//쿠키를 전부 순회
				for(Cookie cookie : cookies){
					//id 라는 이름의 쿠키가 존재한다면
					if(cookie.getName().equals("id")){
						//쿠키 삭제
						//쿠키는 삭제하는 메소드가 없고
						//수명을 0로 만들어서 삭제
						cookie.setMaxAge(0);
						response.addCookie(cookie);
						break;
					}
				}
			}
		}
		//아이디 저장에 체크 한 경우
		else{
			//id를 저장한 쿠키를 생성하고 저장
			
			//쿠키를 생성
			Cookie cookie = new Cookie("id", id);
			//쿠키를 저장
			response.addCookie(cookie);
		}
		// 결과 페이지로 리다이렉트
		response.sendRedirect("loginresult.jsp");
	
	%>
</body>
</html>

 

3) index.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>
	<a href="index.jsp">메인 페이지 </a>
</body>
</html>

 

4) index.jsp 페이지 수정

=> id를 저장한 쿠키가 있으면 쿠키의 값을 id 란에 출력하고 아이디 저장란을 체크하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션과 쿠키 </title>
</head>
<body>
	<%
		//쿠키를 전부 가져오기
		Cookie [] cookies = request.getCookies();
		
		//id 와 idsave 체크를 위한 변수
		String id = "";
		String idsave = "";
	
		//쿠키가 존재하는 경우에만
		if(cookies != null){
			//모든 쿠키를 순회
			for(Cookie cookie : cookies){
				//쿠키 확인
				if(cookie.getName().equals("id")){
					id = cookie.getValue();
					idsave = "checked";
				}
			}
		}	
	%>
	<form action="login.jsp" method="post">
		아이디<input type="text" name="id" value='<%=id %>' required="required" size="40" /><br/>
		비밀번호 <input type="password" name="pw" required="required" size="40" /><br/>
		<input type="checkbox" name="idsave" value="save" <%=idsave %> />아이디 저장<br/>
		<input type="submit" value="로그인"/>	
	</form>
</body>
</html>	

 

 

 

** Session

=> 자료형은 HttpSession

=> jsp 파일에는 처음부터 존재하고 다른 곳에서 사용하고자 할 때는 request객체.getSession()으로 리턴받아서 사용

=> 하나의 브라우저에서 서버에 접속을 하면 그 브라우저를 위한 Map을 서버에 하나 생성하는데 이 Map을 Session이라고 한다.

=> 사용자가 10명까지 접속할 수 있다라는 얘기는 Session을 10개까지 생성할 수 있다라는 의미이다

=> Session이라는 말 대신 Token 이라는 단어를 이용하기도 한다.

 

1. 용도

=> 브라우저가 접속을 시작해서 종료할 때까지 유지해야하는 데이터를 저장

로그인 정보나 장바구니 정보 같은 것을 저장하는 용도로 많이 사용

 

2. 사용

1) 데이터 저장 : setAttribute("이름", 데이터)

2) 데이터 읽기 : Object getAttribute("이름"); => ㄷ이터를 사용할 때는 원래의 자료형으로 강제 형 변환해서 사용

3) 데이터 삭제 : void removeAttribute("이름");

4) 데이터 수정 : 존재하는 이름을 이용해서 저장하면 수정

 

3. 세션 초기화 - 모든 데이터 삭제 : 로그아웃

1) 세션 객체가 inavalidate() 호출

2) web.xml 파일에 설정

<session-config>

       <session-timeout>분단위시간</session-timeout>

</session-config>

=> 설정한 시간동안 세션을 사용하지 않으면 초기화되는 시간을 설정

 

4. 로그인 처리

=> 아이디와 비밀번호를 입력해서 로그인을 시도하면 데이터베이스에 가서 확인하고 아이디와 비밀번호 정보가 맞으면 그 때 필요한 정보(아이디나 닉네임)을 세션에 저장하고 이 후에 로그인 여부는 세션에 저장된 데이터를 가지고 판단하며 로그아웃은 세션에 저장된 데이터를 삭제하는 형태이다.

 

5. 세션 사용시 고려 사항

=> 세션은 서버의 메모리를 사용

=> 세션에 많은 양의 정보를 저장하는 것은 권장하지 않는다.

=> 세션에 많은 양의 정보를 저장할 것 같으면 메모리 데이터베이스르 사용하는 것을 권장한다.

 

6. 세션을 이용한 로그인 처리

1) login.jsp 파일의 하단에 로그인 된 경우에 세션에 정보를 저장하는 코드를 추가

		// 로그인이 되었을 때 필요한 정보를 Session에 저장
		session.setAttribute("id", id);
		session.setAttribute("nickname", 관리자);

 

// 결과 페이지로 리다이렉트 - 로그인 창이 있는 페이지로 돌아가기

response.sendRedirect("index.jsp")

 

2) index.jsp 파일을 수정

=> 로그인이 안된 경우는 로그인 화면을 출력하고 로그인 된 경우는 nickname을 출력하고 로그아웃 링크를 출력하도록 수정

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션과 쿠키 </title>
</head>
<body>
	<%
		//쿠키를 전부 가져오기
		Cookie [] cookies = request.getCookies();
		
		//id 와 idsave 체크를 위한 변수
		String id = "";
		String idsave = "";
	
		//쿠키가 존재하는 경우에만
		if(cookies != null){
			//모든 쿠키를 순회
			for(Cookie cookie : cookies){
				//쿠키 확인
				if(cookie.getName().equals("id")){ 
					id = cookie.getValue();
					idsave = "checked";
				}
			}
		}	
	%>
	
	<%
		// 세션에 nickname 값을 가져와서 변수에 저장 
		// 세션에 저장된 상태가 아니면 null
		String nickname = (String)session.getAttribute("nickname");	
	%>
	<% if(nickname == null){ %>
	<form action="login.jsp" method="post">
		아이디<input type="text" name="id" value='<%=id %>' required="required" size="40" /><br/>
		비밀번호 <input type="password" name="pw" required="required" size="40" /><br/>
		<input type="checkbox" name="idsave" value="save" <%=idsave %> />아이디 저장<br/>
		<input type="submit" value="로그인"/>	
	</form>
	<%}else{ %>
		<%=nickname%>님 환영합니다.<br/>
		<a href="logout.jsp">로그아웃</a>
	<%} %>	
</body>
</html>	

 

3) logout.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>
	<%
		// 세션을 초기화
		session.invalidate();
		// 메인 페이지로 이동
		response.sendRedirect("index.jsp");
	%>
</body>
</html>

 

 

4) web.xml 파일에 세션 만료 시간을 설정

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>javaweb0617</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
	<!-- 3분동안 세션을 사용하지 않으면 세션이 자동으로 초기화 -->
	<session-config>
		<session-timeout>3</session-timeout>
	</session-config>
</web-app>

로그인후 3분동안 아무것도 하지 않으면 자동으로 로그아웃하게 된다.

 

 

5) web.xml 파일을 수정하면 서버를 다시 구동해야 한다.

web.xml 파일은 서버가 구동될 때 1번만 읽어서 사용하기 때문