cookie와 session
에 대해 알아보려고 합니다. cookie와 session
은 서버에서 이전에 요청한 클라이언트의 구분을 위해서 사용하는 것입니다. 이전의 클라이언트의 구분을 한다는게 무슨의미일까요 ? 우선 Session과 Cookie
가 생겨난 배경을 알아본뒤 HTTP 프로토콜의 간단한 동작을 알아보아야 할 것같습니다.
https://www.youtube.com/watch?v=cpFfzE9eGT0 (session : 50:00)
최근 다시 공부하며 알게된 영상인데 설명이 잘되어있습니다.
1. Session과 Cookie의 배경
HTTP 프로토콜의 동작
- 클라이언트는 브라우저 상에 https://www.naver.com을 입력합니다.
- www.naver.com에 해당하는 Server에 (index.html 등)페이지를 요청합니다.
- 요청을 받은 Server와 Client 컴퓨터 간 연결이 수립됩니다.
- Client가 요청한 페이지를 Server에서 응답하게 됩니다.
- Server와 Client간의 연결을 해제합니다.
사이사이 더 많은 과정이 존재하지만 간단하게만 설명을 드렸습니다. 여기서 중요한 점은 Server에서 페이지를 응답한 뒤 연결을 해제한다는 점
입니다.
연결을 해제한다면?
연결을 해제한다
면 어떤일이 벌어질까요? 인터넷 쇼핑중 물건을 장바구니에 담고 새로고침을 누르면 장바구니에 담겨있던 물건이 없어질 것입니다. 바로 내가 누구인지 Server에서 구분을하지 못하기 때문입니다. 이러한 이유로 session
이 생겨났습니다.
연결을 왜 해제하죠?
간단히 본인이 웹사이트를 이용하는 습관을 살펴보면 알 수 있습니다. 예를들어 네이버 웹툰을 본다고 하면, 한 페이지에서 만화를 모두 읽을 때까지 다른 페이지로 이동을 하지 않는것을 볼 수 있습니다. 테드넬슨
은 이러한 점을 생각하고 HTTP프로토콜을 만들었습니다. "아 한번 페이지를 Server에서 주고 나면 연결을 불필요하게 유지할 필요가 없겠구나" 그래서 HTTP프로토콜에서 Server는 페이지를 응답하고 난뒤에는 연결을 해제하도록 만들어졌습니다.
2. Cookie와 Session이란?
위에서 알아본것 처럼 HTTP프로토콜의 특징이자 단점인 응답후 연결을 종료하는 것을 보완하기위해 cookie와 session이 나타났습니다. 그럼 cookie와 session이 무엇인지 각각 알아보도록 하겠습니다.
2.1 Cookie
cookie
는 클라이언트 측에 저장되는 파일입니다. cookie
에는 이름, 값, 만료날짜 등이 들어있습니다.
2.1.1 Cookie 과정
- 브라우저에서 www.naver.com에 접속요청 (헤더에 cookie값이 없음)
- www.naver.com의 server에서 cookie를 HTTP 프로토콜 헤더에 설정하여 발급해준다
- client측에서
cookie
값을 저장한다 - 다시 www.naver.com에 요청시 그에 해당하는
cookie
값이 존재하는지 확인하고 존재하면 HTTP 프로토콜 헤더에cookie
값을 설정하여 요청한다.
2.1.2 Cookie 제한
- 300개 까지 저장
- 하나의 도메인당 20개의 cookie
만을 가짐
- 하나의 cookie
는 최대 4KB
2.1.3 Cookie 사용사례
자동로그인, 팝업창의 오늘 더 이상 이창을 보지않음, 쇼핑몰 장바구니
2.2 Session
일정 시간동안 같은 브라우저
로 부터 오는 요구들을 하나의 상태로 보고 그 상태를 유지하는 기술입니다. 즉, session은 ***브라우저가 종료될 때
까지 유지됩니다.
2.2.1 Session 과정
- 브라우저에서 www.naver.com에 접속요청(헤더에 session-id가 없음)
- 서버에서 세션을 생성하여 사용자에게 페이지를 응답
- Client에서는 이 session-id를 쿠키를 사용하여 서버에 저장
- www.naver.com에 재접속시 저장된 쿠키를 이용하여 session-id를 알아와 cookie-헤더에 설정하여 페이지를 요청
2.3 Cookie vs Session (차이점)
2.3.1 보안
2.4 정리
중요한 점은 session도 cookie
를 기반
으로 되어 있다는 점입니다. 즉, cookie가 동작하지 않는 특수한 상황이라면 session처리를 위해 별도의 처리가 필요합니다. 차이점은 cookie는 사용자 측에 저장되어 관리되지만 session은 서버측에 저장되어 관리 된다는 점입니다.
3. Servelet에서의 Session
session을 어떻게 사용하는지를 간단한 login예제를 통해 알아보도록 하겠습니다.
3.1 예제 진행과정
우선 하나씩 알아보기전에 프로젝트 구조를 보며 전체적인 흐름을 알아보겠습니다. 우선 Client는 login.jsp
페이지를 처음으로 보게됩니다. 로그인 정보를 입력한 뒤 로그인 버튼을 클릭하면, DoLogin(Servlet)
이 실행되며 사용자가 입력한 Id
를 받아와 session
에 저장합니다. 그 후 loginOk.jsp
페이지로 리다이렉팅
됩니다. loginOk.jsp
페이지에서는 JSP의 내부객체인 session을 이용하여 session에 id
를 key값으로 하는 value가 있는지를 확인하고 value가 존재하면 화면에 출력하고, 존재하지 않는다면 id를 입력해달라는 메시지를 화면에 출력합니다.
*JSP 내부객체?
jsp 내부객체는 웹컨테이너에의해서 JSP가 Servlet으로 변환될때 자동으로 생성되기 때문에 별도의 생성과정 없이 사용가능한 객체들을 의미합니다. JSP가 servlet으로 변환되어 생성된 .java
파일을 열어보면 _jspService()메소드 안에서 내장객체들이 생성되는 것을 볼 수 있습니다. 조금 더 세부적인 확인을 위해 https://galid1.tistory.com/491 를 확인하면 좋습니다~.
3.2 예제
login.jsp
<body>
<form action="doLogin" method="post">
id : <input type="text" size="10" name="id">
pw : <input type="password" size="10" name="pw">
<input type="submit" value="제출"/>
<input type="reset" value="재입력"/>
</form>
</body>
우선 간단하게 login을 요청하는 form을 만들었습니다. id, pw를 입력받고 DoLogin servlet
에게 post메소드로 요청합니다.
DoLogin.java(Servlet)
package com.java.ex;
import java.io.IOException;
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;
"/doLogin") (
public class DoLogin extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
String pw = request.getParameter("pw");
HttpSession session = request.getSession();
session.setAttribute("id", id);
response.sendRedirect("loginOk.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
servlet에서는 사용자구분을 위해 Session객체를 가져온 뒤 session
에 사용자가 입력한 id
를 속성으로 저장합니다. 그 후 loginOk.jsp
페이지로 리다이렉트 시킵니다.
loginOk.jsp
xxxxxxxxxx
<body>
<%! String id; %>
<%
id = session.getAttribute("id").toString();
out.println(session.getAttribute("id"));
if (session.getAttribute("id").equals("")){
out.println("id를 입력해주세요.");
}
else{
out.println(id + "님 안녕하세요.");
}
%>
</body>
loginOk.jsp 페이지에서는 간단히 내부의 session객체를 이용하여 저장된 값을 가져와 id를 입력했는지 안했는지를 구분한 뒤 적절한 메시지를 출력합니다.
이런식으로 Server
에서는 session
을 이용하여 이전 사용자를 구분하거나 login 유무 등을 판별하여 로직을 작성할 수 있습니다.
4. 사용자마다 세션을 어떻게 구분할까요?
<body>
<%! String id; %>
<%
id = session.getAttribute("id").toString();
out.println(session.getAttribute("id"));
if (session.getAttribute("id").equals("")){
out.println("id를 입력해주세요.");
}
else{
out.println(id + "님 안녕하세요.");
}
%>
</body>
위의 코드를 보면 다음과 같은 의문이 생길수도 있습니다. "A가 접속하든 B가 접속하든 똑같이session.getAttr ibute("id")
를 이용해서 session
값을 가져오는데 어떻게 서로다른 값을 가져와서 사용자들을 구별할 수있지?"
바로 위 그림을 보면 알 수 있듯이 session
은 Client(웹브라우저)
당 하나씩 생성되어 제공되는 것을 볼 수 있습니다. 따라서 session.getAttribute("id")
를 하더라도 서로다른 값이 보이게 됩니다. 이는 session
은 브라우저를 종료할 때 사라진다는 점을 유추해보면 알 수 있는 사실이기도 합니다.
'Web > Web' 카테고리의 다른 글
Web - 브라우저 저장소(Web Storage란) (0) | 2023.03.26 |
---|---|
Web - HTTP 커넥션 관리(성능 향상을 위한) (0) | 2019.08.25 |
Web - Web Server, Web Container, WAS 의 이해 (0) | 2019.03.24 |
Web - WSGI 와 CGI (0) | 2018.12.15 |
Web - Apache 설치 (Window, CentOS7(Linux)) (0) | 2018.12.15 |