5. 2 [ 쿠키 & 세션 ]

Lee·2023년 5월 2일
0

오.배.이.안& 회고

목록 보기
42/46

오배이안 🪙


HTTP 특징

HTTP는 두가지 특징을 가진다.

  • 비연결성(connectionless)
  • 무상태성 (stateless)

비연결성(connectionless)
HTTP 는 클라이언트와 서버간 실제로 요청을 주고 받을 때만 연결을 유지하고 서버에서 응답을 주면 TCP/IP 연결을 끊는 특징을 가지고 있다.

무상태성(stateless)
HTTP 는 클라이언트와 서버의 통신이 끝나면 상태를 유지하지 않는 특징을 가지고 있다.

위와 같은 특징을 가지고 있기 때문에 서버측에선 클라이언트가 누구인지 매번 확인해야한다. (동일한 클라이언트라도 )
이러한 특징을 보완하기 위해 쿠키와 세션을 사용하게 되었다.


쿠키란?

쿠키는 클라이언트(브라우저)에 저장되는 키와 값들이 들어 있는 작은 데이터 파일 이다.
이 데이터 파일은 어떤 웹사이트에 들어갔을 때, 서버가 일방적으로 클라이언트에 전달하는 데이터 파일이다.

서버로 부터 쿠키를 받은 클라이언트는 이 쿠키를 브라우저에 저장해놓고 있다가 해당 웹 사이트에 다시 요청을 보낼때 쿠키를 같이 보내게된다. 보낼때에도 특정조건(쿠키 옵션) 들이 만족되어야 보낼 수 있고 HTTP 헤더의 Set-Cookie 에 정보를 넣어 보내게 된다.

HTTP 에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장해놓고 있다가 필요시 정보를 참조하거나 재사>용할 수 있다.

HTTP의 무상태성 특징을 가진 인터넷 연결을 Stateful 하게 유지할 수 있다. 상태를 유지할 수 있다는 말! 하지만 보안에 취약해서 민감한 정보는 쿠키에 담지 않는것이 좋다.!


동작 순서

1. 클라이언트(브라우저) 가 페이지를 요청 (사용자가 웹 사이트에 접근)
2. 웹 서버는 쿠키를 생성
3. 생성한 쿠키를 HTTP 헤더에 포함시켜 클라이언트에게 응답
4.응답을 받은 클라이언트(브라우저)는 쿠키를 계속 보관하고 있다가 다시 해당 웹 서버로 요청할때 HTTP 헤더에 쿠키를 포함시켜 요청을 보냄
(동일 웹 페이지에 재방문시 클라이언트의 PC에 쿠키가 있는 경우, HTTP 헤더에 쿠키 포함시켜 요청을 보내게 됨)


쿠키 옵션 종류

서버에서 쿠키를 생성하고 클라이언트로 응답을 보낼 때 여러 옵션들을 작성할 수 있는데 그 종류를 알아보자

1. 도메인
서버와 요청의 도메인이 일치하는 경우 쿠키 전송 : naver , localhost 와 같이 www 옆에 있는 도메인만 검사함

2. Path
서버와 요청의 세부경로가 일치하는 경우 쿠키 전송 : /user 와 같이 세부 경로만 검사함

3. MaxAge or Expires
쿠키의 유효기간 설정

  • 세션쿠키 : MaxAge or Expires 옵션이 없는 쿠키로 임시 쿠키의 역할이다 브라우저가 종료되면 해당 쿠키 삭제 됨
  • 영속성 쿠키 :브라우저 종료와 상관없이 MaxAge or Expires 에 지정된 유효시간 만큼 사용가능한 쿠키

4. HttpOnly
스크립트의 쿠키 접근 가능 여부 결정 : false 값을 가지고 있으면 자바스크립트가 접근할 수 있기 때문에 해커들이 이상한 짓 할 수 있게 됨

5. Secure
HTTPS 프로토콜에서만 쿠키 전송 여부 결정 : true 값을 가지면 HTTP 에서는 쿠키 전송 못하게 됨 localhost는 예외이다.

6. SameSite
Cross-Site 요청을 받은 경우 옵션 및 메서드에 따라 쿠키 전송 여부 결정

HttpOnly 옵션을 사용하지 않는다면 자바스크립트를 이용해서 쿠키에 접근할 수 있다, 그렇게 되면 해커들이 나의 브라우저에 저장되어 있는 쿠키를 탈취해 서버에 접근해도 서버는 의심하지 않고 인증된 유저의 요청으로 취급하게 된다. 그렇기 때문에 쿠키에 민감한 정보를 담는 것은 위험하다.

민감 정보는 서버에서 보관 할 수 있게 세션에다 저장해야 한다..!

또한 쿠키는 유효기간이 없고 클라이언트가 삭제하지 않는 한 없어지지 않고 계속 저장되어 있을 수 있다..!(영속성 쿠키)

쿠키는 예를들어 로그인 창의 아이디 기억하기 로직이나, 팝업창 몇일동안 안보기 로직을 구현하는데에 사용된다.


세션 (Session)

세션이란?

세션이란 사용자가 인증에 성공한 상태를 말한다.

일정 시간동안 같은 사용자(브라우저)로부터 들어오는 요청을 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술이다.
데이터를 클라이언트에 저장하는 쿠키와 달리 서버측에 데이터를 저장하고 관리하는 걸 말한다.
이때 서버에선 클라이언트를 구분하기 위해서 세션ID를 통해 구분하게 된다.

세션은 서버에서 사용자 데이터를 관리하기 때문에 쿠키보다 보안측면에선 좋지만 사용자가 많아질 수록 서버의 메모리 부담이 증가하게 된다.


동작 방식

세션은 유저에 대한 정보를 서버에서 관리하는 것을 말한다. 이때 데이터들이 담겨 있는 세션 스토어 (데이터 베이스) 에는 각 클라이언트를 구분하기 위해 세션ID가 발급되고 이를 쿠키에 담아 클라이언트로 응답을 보낸다.

응답을 받은 클라이언트는 쿠키 안에 들어있는 세션ID도 받았기 때문에 브라우저가 종료되기 전까진 다른 요청을 서버에 보낼 시 HTTP 헤더에 세션ID도 같이 보냄으로서 서버에선 어떤 클라이언트가 요청을 보낸건지 쿠키안에 있는 세션ID를 통해 알 수 있고, 요청에 대한 작업을 수행하게 된다.

1.클라이언트가 페이지를 요청 (사용자가 웹 사이트에 접근)
2.서버는 요청의 HTTP 헤더에 쿠키를 확인하고 쿠키 안에 세션ID 가 있는지 확인한다.
3.세션ID가 없다면 서버는 세션ID를 생성해 클라이언트에게 응답을 보낼 때 HTTP 헤더의 쿠키 속에 넣어 보내게 된다.
4.서버는 클라이언트에게 준 세션ID를 통해서 클라이언트들의 상태를 구분할 수 있게 되고 그 상태들을(데이터) 서버 DB에 세션ID를 포함해서 객체의 형태로 저장한다.
5.클라이언트는 재접속하여 요청을 보낼때 HTTP 헤더에 쿠키에 가지고 있던 세션ID를 포함시켜 요청을 보내게 된다.
6. 서버는 해당 세션ID 가 DB에 있는지 확인 하고 있다면 인증된 유저라고 인식하고 요청에 대한 작업을 처리한다.


세션의 특징

  • 각 클라이언트마다 고유한 세션ID를 부여 할 수 있다.
  • 세션ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공할 수 있다.
  • 보안 면에서 쿠키보다 안전하다.
  • 사용자가 많아지면 서버 메모리를 많이 차지하게 된다.

주로 보안상 중요한 작업을 하는 경우에는 (로그인 정보) 세션에다가 정보를 저장해 놓는다.


쿠키와 세션은 특성이 서로 다르기 때문에 어떤게 더 좋다고는 할 수 없다.
모든 데이터를 세션에 저장한다고해도 좋은게 아니고 쿠키에 저장한다고 해도 좋은게 아니다.
클라이언트, 서버에 상태를 저장할 때의 장단점이 존재하기 때문에 이 둘은 어떤 상황에선 어떤게 좋은지 잘 판별해서 사용하도록 하는게 중요하다고 느꼈다..!

참조
사진 출처 코드스테이츠

0개의 댓글