진짜 개발자
본문 바로가기

Web/Web

Web - cookie 와 session 분석 (servlet 예제)

728x90
session에 대해 알아보려고 합니다

cookie와 session에 대해 알아보려고 합니다. cookie와 session은 서버에서 이전에 요청한 클라이언트의 구분을 위해서 사용하는 것입니다. 이전의 클라이언트의 구분을 한다는게 무슨의미일까요 ? 우선 Session과 Cookie가 생겨난 배경을 알아본뒤 HTTP 프로토콜의 간단한 동작을 알아보아야 할 것같습니다.

 

https://www.youtube.com/watch?v=cpFfzE9eGT0 (session : 50:00)

최근 다시 공부하며 알게된 영상인데 설명이 잘되어있습니다.


1. Session과 Cookie의 배경

HTTP 프로토콜의 동작

  1. 클라이언트는 브라우저 상에 https://www.naver.com을 입력합니다.
  1. www.naver.com에 해당하는 Server에 (index.html 등)페이지를 요청합니다.
  2. 요청을 받은 Server와 Client 컴퓨터 간 연결이 수립됩니다.
  3. Client가 요청한 페이지를 Server에서 응답하게 됩니다.
  4. 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 과정

  1. 브라우저에서 www.naver.com에 접속요청 (헤더에 cookie값이 없음)
  2. www.naver.com의 server에서 cookie를 HTTP 프로토콜 헤더에 설정하여 발급해준다
  3. client측에서 cookie값을 저장한다
  4. 다시 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 과정

  1. 브라우저에서 www.naver.com에 접속요청(헤더에 session-id가 없음)
  1. 서버에서 세션을 생성하여 사용자에게 페이지를 응답
  2. Client에서는 이 session-id를 쿠키를 사용하여 서버에 저장
  3. www.naver.com에 재접속시 저장된 쿠키를 이용하여 session-id를 알아와 cookie-헤더에 설정하여 페이지를 요청

 



2.3 Cookie vs Session (차이점)

위 표와같이 Cookie와 Session에는 많은 차이가 있지만, 보안에 대해서만 조금더 자세히 살펴보도록 하겠습니다.

2.3.1 보안

보안적인 차이를 발생시키는 것은, 중요 정보를 어디에 저장하는지에서 발생합니다. 중요 정보를 쿠키를 이용해 Client에 저장할 경우 위변조에 위험이 존재하지만, Server에 저장할 경우에는 그렇지 않습니다.

Cookie의 경우 서버에서 Cookie를 발급할 때 "사용자 ID, 로그인 시간, IP 등"의 정보를 암호화하여, "키=암호화된 정보"의 형태로 Client 측에 저장합니다.

Session의 경우 "Session ID = 정보"의 형태로 서버에서 저장하고 있으며, 쿠키를 이용해 정보에 대응하는 "Session ID"를 Client 측에 저장합니다. 후에 Client는 이 쿠키를 서버에 보내고, 서버에서는 Session ID를 이용해 서버에 저장된 사용자 정보를 가져와 처리하게 됩니다.

즉 중요한 정보는 Session을 이용해 저장하는것이 보안에 조금 더 도움이 될것입니다.







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

우선 간단하게 login을 요청하는 form을 만들었습니다. id, pw를 입력받고 DoLogin servlet에게 post메소드로 요청합니다.

 

DoLogin.java(Servlet)

servlet에서는 사용자구분을 위해 Session객체를 가져온 뒤 session에 사용자가 입력한 id를 속성으로 저장합니다. 그 후 loginOk.jsp페이지로 리다이렉트 시킵니다.

 

loginOk.jsp

loginOk.jsp 페이지에서는 간단히 내부의 session객체를 이용하여 저장된 값을 가져와 id를 입력했는지 안했는지를 구분한 뒤 적절한 메시지를 출력합니다.

 

이런식으로 Server에서는 session을 이용하여 이전 사용자를 구분하거나 login 유무 등을 판별하여 로직을 작성할 수 있습니다.

 

 

4. 사용자마다 세션을 어떻게 구분할까요?

위의 코드를 보면 다음과 같은 의문이 생길수도 있습니다. "A가 접속하든 B가 접속하든 똑같이session.getAttr ibute("id")를 이용해서 session 값을 가져오는데 어떻게 서로다른 값을 가져와서 사용자들을 구별할 수있지?"

 

바로 위 그림을 보면 알 수 있듯이 sessionClient(웹브라우저)당 하나씩 생성되어 제공되는 것을 볼 수 있습니다. 따라서 session.getAttribute("id")를 하더라도 서로다른 값이 보이게 됩니다. 이는 session은 브라우저를 종료할 때 사라진다는 점을 유추해보면 알 수 있는 사실이기도 합니다.