세션 vs 쿠키

2022. 11. 26. 18:57몰랐던거/WEB

인증, 인가란?

  • 인증 : 사용자의 신원을 검증하는 프로세스

    ex) 로그인(비밀번호), 일회용 핀 등

  • 인가 : 사용자에게 특정 리소스나 기능에 액세스할 수 있는 권한을 부여하는 프로세스

    ex) 관리자 페이지, 특정 게시물 삭제 or 수정 권한 등

⇒ 이러한 인증, 인가를 위해서 쿠키, 세션이 필요하다.

왜 세션, 쿠키가 필요할까?

우리가 Web에서 사용하는 프로토콜은 HTTP이다.

HTTP의 특성에는 Stateless, Connectionless가 있다.

  • Stateless : 통신이 끝나면 상태를 유지하지 않는 특성이다.
  • Connectionless : 요청과 응답 후에 연결을 끊어 버리는 특성이다.

그렇기에 한 번의 HTTP 통신 이후에 이 통신에서의 정보를 기억하고 있지 않는다.

그럼 로그인 했던 정보나 권한에 대한 정보를 어떻게 확인하지?? 매번 모든 요청마다 아이디와 비밀번호를 정보로 보내서 로그인하고 권한을 확인한 후에 요청된 작업을 해야하는 것인가?? 너무 비효율적인데??

⇒ 그래서 세션, 쿠키가 필요하다.

세션 vs 쿠키

세션과 쿠키 모두 웹에서의 인증, 인가를 위해 사용이 되는 친구들이다. 그렇다면 이 둘의 차이점은 무엇이고 어떤 방식으로 인증, 인가에서 사용될까?

일단 이 둘의 차이점사용자가 제공한 정보가 저장되는 위치이다.

세션에선 해당 정보를 서버 측에 저장되는 반면에 쿠키에선 해당 정보를 사용자의 브라우저 혹은 클라이언트 측에 저장된다. 이 둘에 대해서 자세히 알아보자.

세션이란?

세션은 서버에 저장된 전역 변수라고 생각하면 좋을 것 같다.

각 세션에는 저장된 값을 검색하기 위한 고유 ID가 할당이 되고 이는 응답 헤더 Set-Cookie 에 실어서 보내진다. 해당 응답을 받은 클라이언트 측은 Set-Cookie에 할당된 세션 ID를 포함하는 쿠키를 저장한다. 이제 요청 시에 해당 세션 ID를 쿠키 헤더 Set-Cookie에 실어서 보내면 서버 측에선 매 요청마다의 인증없이 식별이 가능해진다. ( 만약 클라이언트 브라우저가 쿠키를 지원하지 않으면 세션 ID가 URL에 표시됨. ) 세션은 비교적으로 쿠키보다 큰 데이터를 저장할 수 있는 용량이 있다. 브라우저를 닫으면 세션 값이 자동으로 삭제되고 값을 영구적으로 저장하기 위해선 DB에 저장해야한다.

⇒ HTTP에서 Stateless가 중요한 이유가 서버 확장 시에 서버 간 정보 공유가 적은 것이 비용 최소화에 도움이 되어서 중요하다고 알고 있는데 그럼 서버 간 세션 ID를 공유해야해서 좋지 않는 것이 아닌가? (확장성 문제)

⇒ 이를 해결하기 위해서 요청이 무조건 세션을 생성한 서버로 향하도록 하는 Sticky Session, 여러 웹 서버가 모두 동일한 세션 정보를 가지고 있는 Session Clustering 방식보다 세션 정보를 관리하는 서버를 별개로 두는 Session Storage 방식이 가장 많이 쓰인다고 한다.

쿠키란?

쿠키는 웹 서버가 클라이언트 브라우저에 저장하는 사용자 정보가 담긴 최대 크기 4KB의 작은 파일이다. 이는 유효한 시간을 명시할 수 있어서 브라우저가 종료되어도 인증이 유지된다는 특징이 있다. (ex. 자동로그인)

⇒ 만약 쿠키가 엄청나게 커지면 매 요청마다 엄청나게 큰 쿠키를 실어서 보내야 한다는 것인가? (오버헤드 문제)

⇒ 그렇기에 쿠키가 커지면 요청마다 큰 오버헤드가 발생하게 된다. 그래서 쿠키의 크기를 최대 4KB로 제한하고 사이트당 쿠키 갯수에 제한도 존재한다.

또 요청에 사용자 정보를 실어서 보내는 방식이기에 보안에 취약하다.

⇒ 세션과 쿠키는 비슷한 역할에 동작원리도 비슷하다. 세션도 쿠키를 이용하기 때문이다. 그렇다면 이 둘의 차이점에 대해서 더 알아보자.

세션과 쿠키의 차이점

가장 큰 차이는 앞서 말했던 정보의 저장되는 위치 차이이다. 세션은 서버에 사용자 정보가 저장되고 그 때 생성되는 세션 ID를 쿠키로 클라이언트가 저장해 식별하는 방식이고 쿠키는 사용자 정보를 로컬에서 쿠키로 저장하고 매 요청마다 해당 쿠키를 보내는 방식이다. 다른 차이점들을 생각해보자.

  • 보안
    • 보안 상으로 세션이 쿠키보다 훨씬 유리하다. 쿠키는 사용자 정보가 담긴 쿠키를 요청에 담기에 헤더를 통해 정보가 노출된다. 반면 세션은 세션 ID만 노출되기에 안전하다.
  • 속도
    • 쿠키는 정보가 서버 요청 시 헤더에 담겨가기에 빠르고 세션은 헤더에 담긴 세션 ID를 통해서 서버에서 찾아야 하기에 더 느리다.
  • 라이프 사이클
    • 쿠키는 만료시간이 있긴 하지만 파일로 로컬에 저장되어서 브라우저를 종료해도 정보가 남아있다. 물론 세션도 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간 상관없이 삭제된다.

⇒ 속도는 좀 느려도 보안 상으로 세션을 사용하면 좋을 것 같다는 생각이 들지만 서버에 정보를 저장하기 때문에 서버 자원이 부족해지면 속도가 느려질 수 있다. 그런 경우 쿠키가 유리하다.

⇒ 그래서 최근엔 이런 문제를 보완한 토큰 기반의 인증방식을 사용한다고 한다.

Reference

Difference Between Cookie and Session
Key Difference between Session and Cookie Sessions are server-side files that contain user information, whereas Cookies are client-side files that contain user information. Session is dependent on Cookie, but Cookie is not dependent on a session. Session ends when a user closes his/her browser, while a Cookie expires depending on the lifetime you set for it.
https://www.guru99.com/difference-between-cookie-session.html
쿠키와 세션 개념
노션 페이지(아래 내용과 동일) 개요 쿠키와 세션은 개발자 말고도 인터넷 사용자라면 누구나 많이 들어본 단어입니다. 하지만 개념에 대해서는 많은 사람들이 헷갈려 하기에 쉽고 간단하게 정리해보려고 합니다. 일단 쿠키를 발급받고 사용하는 과정에 대해서 그림으로 보여드리고, 쿠키와 세션에 대한 설명을 하도록 하겠습니다. 목차 1. HTTP의 특징과 쿠키와 세션을 사용하는 이유 2.
https://interconnection.tistory.com/74
쿠키와 세션 (ft. HTTP의 비연결성과 비상태성)
HTTP는 요청과 응답을 한번 주고받으면 바로 연결을 끊어버리는 특성을 가지고 있다. 그리고 다음 요청을 하기 위해 다시 연결을 맺어야한다. 이를 HTTP의 비연결성(Connectionless) 이라고 한다. 또한 HTTP 프로토콜은 요청과 응답을 교환하는 동안 상태(Status)를 저장하지 않는다. 따라서 HTTP 레벨에서는 이전에 보냈던 리퀘스트나 리스폰스를 기억하지 못한다. 즉, HTTP 요청은 직전의 요청과 전혀 관련이 없다.
https://hudi.blog/cookie-and-session

Uploaded by N2T

'몰랐던거 > WEB' 카테고리의 다른 글

[HTTP] HTTP 1.1 vs HTTP 2.0 (2)  (0) 2023.04.18
[HTTP] HTTP 1.1 vs HTTP 2.0  (0) 2023.04.14
[Architecture] Layered Architecture(feat. MVC 패턴)  (0) 2022.11.05
Javascript, HTML, CSS  (0) 2022.08.30