cookie, session

zee-chive·2024년 9월 23일

Back

목록 보기
2/3

HTTP (Hyper Text Transfer Protocol)

인터넷을 통신하기 위한 프로토콜 협약으로 웹 서버와 웹 브라우저 간의 통신에 사용된다.
HTTPS 는 보안(s)을 보장한 것이 된다.

인터넷 프로토콜 : 인터넷에서 데이터 통신을 위한 표준화된 규약이나 규칙

  • TCP : 순서를 보장 (HTTP 1.1 버전이 주로 다룬다.)
  • UDP : 순서는 보장할 수 없지만 속도가 빠르게 유지가 된다.
  • 포트 번호 : 컴퓨터의 IP 포트 번호를 전달하는 것이다.
  • 기본 포트 번호는 80이며, 보안 버전의 HTTPS는 기본 포트 번호가 443이 된다.
  • 클라이언트와 서버 구조를 갖고 있다.



HTTP 특징

  1. 비연결성
    • 지속적인 연결 유지로 인한 비용(자원) 낭비를 위해 연결 해제
    • 한 번의 연결에 대한 응답을 주면 종료가 된다.
    • 서버의 자원을 효율적으로 활용할 수 있다.
  1. 무 상태
    • 서버가 클라이언트의 상태를 저장하지 않는다.
    • 클라이언트의 상태를 알 수 없기 때문에 추가적인 데이터 전송이 필요함
    • 한 명의 서버가 종료가 되면 다른 서버는 클라이언트의 상태를 알 수 없다고 생각하면 쉽다.
    • 응답 서버를 쉽게 바꿀 수 있음
    • 브라우저 쿠키 or 서버 세션 등을 이용하여 상태 유지
  1. 상태 코드
    • 100번대 : Informational Responses → 정보 응답
    • 200번대 : Successful Responses → 성공적인 응답을 받은 경우
    • 300번대 : Redirection Messages
      → redirect 가 포함된 response가 정상적으로 반영이 된 경우
    • 400번대 : Client Error Responses
      → 클라이언트가 실수를 하여 오류가 나는 경우 (페이지 처리 가능)
    • 500번대 : Server Error Responses
      → 서버에 오류가 생겨 반응하게 되는 경우 (400번 때와 동일한 페이지 처리를 하는 경우가 많다.)





  • 웹 서버가 클라이언트의 웹 브라우저에 저장하는 작은 데이터 조각
  • 필요에 따라 요청(request)시 서버로 같이 전송
  • Key : Value 형태의 문자열 데이터
  • 웹 브라우저 별로 별도의 쿠키 생성 (브라우저가 다르면 다른 사용자가 된다.)
  • 관리자 도구에서 SID를 삭제하게 되면 자동으로 지워지게 된다.

  • 동작 순서
    1. Client가 요청 생성
    2. WAS는 Cookie를 생성하고, HTTP Header에 Cookie를 넣어 응답
    3. Client(Browser)sms Cookie를 저장 후, 해당 서버에 요청할 때 요청과 함께 Cookie를 전송
    4. 브라우저가 종료가 되더라도 만료 기간 전까지 저장이 되기 때문에, 동일 사이트 재방문하여 요청 시 필요에 따라 Cookie가 재전송 된다.
  • 사용목적
    • 세션 관리(장바구니, 사용자 아이디 등) 을 위하여 사용
    • 사용자가 설정한 환경 등을 기억하여 페이지 제공
    • 사용자의 행동과 패턴을 분석
    • 사용자의 관심에 따른 광고를 타겟팅하기 위해서 사용도 한다.
  • 특징
    • 이름(Key), 값 (Value), 만료일, 도메인 경로 등으로 구성이 된다.
    • 클라이언트에 최대 300 개의 쿠키를 저장할 수 있다.
    • 하나의 도메인 당 20개의 쿠키를 저장할 수 있다.
    • 쿠키 하나당 4KB 제한


자바 구현

@WebServlet("/make")
public class MakeCookieServlet extends HttpServlet {

	
	@Override 
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
		String key = req.getParameter("key");
		String value = req.getParameter("value");
		
		// 쿠키 생성
		Cookie cookie = new Cookie(key, value);
		
		// 유효 시간 결정 : 초단위 
		cookie.setMaxAge(60);
		
		// 쿠키를 삭제하고 싶은 경우 
//		cookie.setMaxAge(0); 
		
		res.addCookie(cookie);
		res.sendRedirect(req.getContextPath()+"/02_CookieResult.jsp");

	}
}

서블릿에서 사용하게 되는 경우

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키생산공장</title>
</head>
<body>
	<h2>쿠키 설정</h2>
	<form action="make" method="GET">
		이름 : <input type="text" name="key"> <br>
		내용 : <input type="text" name="value"> <br>
		<button>생성</button>
	</form>
</body>
</html>

위와 같이 입력을 받아 출력은 아래와 동일하게 하는 것이다.

<%@ 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(Cookie c : cookies){
				out.print(c.getName() + " : " + c.getValue() + " <br>");
			}
		} else {
			out.print("쿠키가 없다.");
		}
	
	%>
	
	<a href="index.html">홈으로</a>
</body>
</html>


JSP 기본 영역

JSP 기본 객체 영역 (Scope) 메서드

  • servlet과 페이지 간 정보를 공유하기 위해서 메서드를 지원한다
메서드반환형설명
setAttribute(String name, Object value)voidkey-value 형태로 각 영역에 데이터를 저장. name이 value를 언어 오기 위한 key가 된다.
getAttribute(String name)Object현재 객체에서 인자로 받은 이름으로 설정된 값을 반환.
getAttributeNames()Enumeration현재 객체에서 설정된 값의 모든 속성의 이름을 반환.
removeAttribute(String name)void현재 객체에서 인자로 받은 이름으로 설정된 값을 삭제.






Session

  • 사용자가 웹 서버에 접속해 있는 상태를 하나의 단위로 세션이라 한다.
  • 각 세션은 sessionid를 이용해 구분한다.
  • WAS의 메모리에 객체 형태로 저장.
  • 메모리가 허용하는 용량까지 제한 없이 저장 가능.
  • 쿠키는 클라이언트에 저장되기 때문에 공유 PC의 경우 보안에 취약할 수 있다.
    하지만 세션은 서버에 저장되기 때문에 쿠키에 비해 보안이 좋다.
  • 사용자(로그인) 정보 및 장바구니 등에 사용한다.


  • 동작 순서
    1. 클라이언트가 페이지를 요청
    2. 서버는 쿠키에 session id가 있는지 확인한다.
    3. session id가 존재하지 않으면, session id를 생성해 쿠키에 쓴 다음 클라이언트로 반환
    4. 생성된 session id를 이용하여 서버 내 메모리를 생성
    5. 클라이언트가 다음 요청 시 쿠키에 session id (JSESSIONID)를 포함해 전달하면 서버 내 저장된 session id와 비교하여 데이터 조회
  • jsp 파일로 한 번에 하는 것이 아닌 서블릿으로 해결하는 것이 좋다.
  • getParameter 는 클라이언트가 작성한 값을 갖고 오는 것이고
  • getAttribute 는 서버에서 처리 중에 지정한 값을 갖고 온 것이다.
profile
누가 봐도 읽기 쉬운 글이 최고의 글이다.

0개의 댓글