devFancy BE Developer

쿠키와 세션

2023-10-24
devFancy

쿠키를 사용하게 된 배경

  • HTTP 주요 특징은 무상태성과, 비연결성이다.

  • 무상태성은 서버가 클라이언트의 상태를 보존하지 않는다는 것을 의미하고, 비연결성은 말 그대로 연결을 유지하지 않는다는 것을 의미한다.

  • 두가지 특징에 대한 자세한 설명은 HTTP 기본에 작성해두었다.

  • 예를 들어, 홈페이지에서 로그인을 하고 난 뒤에 새로 고침을 하게 되면 로그인이 풀리는 상태가 된다.

  • 로그인을 유지하기 위해서 서버가 다수의 클라이언트와 연결을 유지할 수 있지만, 그로 인해 자원이 낭비가 된다.

  • 이러한 HTTP의 2가지 특징을 보완하기 위해 쿠키가 등장하게 되었다.

쿠키(Cookie)

  • 쿠키(Cookie)는 사용자(클라이언트)가 어떤 웹 사이트를 방문할 때, 사용자의 웹 브라우저를 통해 사용자 로컬에 키(Key)와 값(Value) 을 저장하는 작은 데이터 파일이다.

  • 서버는 클라이언트의 로그인 요청에 대한 응답을 작성할 때, 클라이언트 측에 저장하고 싶은 정보를 응답 헤더의 Set-Cookie에 담아 전달한다.

  • 이후 해당 클라이언트는 요청을 보낼 때마다 요청 헤더에 Cookie를 담아 전송한다.

  • 쿠키에 담긴 정보를 통해 서버는 해당 요청의 클라이언트가 누구인지 식별한다.

쿠키의 타입

  • 쿠키는 세션 쿠키지속 쿠키, 두 가지 타입으로 나뉜다.

  • 세션 쿠키(Session Cookie) : 브라우저 메모리에 저장되므로, 사용자가 사이트를 검색할 때 관련된 설정과 선호 사항들을 저장하는 임시 쿠키로 브라우저를 종료하면 해당정보가 삭제된다.

  • 지속 쿠키(Persistent Cookie) : 파일로 저장되므로, 브라우저가 종료되거나 컴퓨터가 재시작되어도 해당정보가 남아있다.

  • 두 가지 쿠키를 구분하는 기준은 파기되는 시점이다. 파기되는 시점을 가리키는 Expires 혹은 Max-Age 파라미터가 없으면 세션 쿠키이다.

Set-Cookie: <쿠키 이름>=<쿠키 값>; Expires=종료 시점
Set-Cookie: <쿠키 이름>=<쿠키 값>; Max-Age=유효 기간

쿠키의 단점

쿠키가 브라우저, 즉 클라이언트 측에 저장된다라는 것은 상당히 널리 알려진 사실이다. 이 부분은 쿠키가 탄생하게 된 중요한 배경이며, 안타깝게도 갖가지 이슈가 존재한다.

따라서 쿠키를 사용할 때는 아래와 같은 쿠키의 한계점들을 잘 인지하고 사용하는 것이 중요하다.

  • 쿠키의 값이 브라우저에서 확인할 수 있어서 누군가로부터 유출 및 조작 당할 위험이 존재하므로 보안에 취약하다.

  • 쿠키는 작은 데이터 파일로, 용량에 제한이 있기 때문에 많은 정보를 담을 수 없다.

  • 웹 브라우저마다 쿠기에 대한 지원 형식이 다르기 때문에 브라우저 간에 공유가 불가능하다.

  • 쿠기의 사이즈가 커질수록 네트워크에 부하가 심해진다.

쿠키의 보안 속성

이러한 쿠키의 한계와 대체 기술에도 불구하고 반드시 쿠키를 사용해야 하는 상황이라면 가급적 보안 속성을 사용하시기를 권장한다.

  • 첫번째 보안 속성은 Secure 이다. Set-Cookie 응답 헤더에 이 속성이 명시된 쿠키는 브라우저가 https 프로토콜 상에서만 서버로 돌려 보낸다. 네트워크 상에서 탈취되었을 때 문제가 될 수 있는 쿠키를 상대로 쓰면 유용할 것이다.
Set-Cookie: <쿠키 이름>=<쿠키 값>; Secure
  • 두번째 보안 속성은 HttpOnly이다. Set-Cookie 응답 헤더에 이 속성이 명시된 쿠키는 이 속성이 명시된 쿠키는 브라우저에서 자바스크립트로 Document.cookie객체를 통해 접근할 수 없다.
Set-Cookie: <쿠키 이름>=<쿠키 값>; HttpOnly

세션(Session)

  • 쿠키는 브라우저에 저장하기 때문에 보안에 취약하는 단점이 있다.

  • 쿠키의 가장 큰 단점인 유출 및 조작 당할 위험을 보완하기 위해 세션을 사용한다.

  • 세션은 비밀번호와 같은 클라이언트의 인증 정보를 쿠키가 아닌 서버에 저장하고 관리한다.

  • 클라이언트가 서버측에 요청을 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는데, 이때 이 유일한 ID가 세션ID이다.

  1. 클라이언트가 서버에게 로그인 요청(ID, Password)을 보낸다.
  2. 서버는 로그인 요청이 정상적으로 처리된다면, 유일한 ID인 세션ID을 생성하여 서버의 메모리에 저장한다.
  3. 서버가 클라이언트의 로그인 요청에 대한 응답을 보낼 때 이전에 생성한 세션ID를 쿠키에 담아서 전달한다.
  4. 이후에 클라이언트는 요청을 보낼 때마다 쿠키에 있는 세션ID를 전달한다.
  5. 서버는 세션ID의 유효성을 판별하여 클라이언트를 식별한다.
  6. 사용자가 브라우저를 종료하면 Session의 정보는 삭제된다.

세션의 장단점

  • 장점1 : 쿠키를 포함한 요청이 외부에 노출되더라도 세션ID 자체는 유의미한 개인정보를 담고 있지 않아서 비교적 안전하다.

  • 단점1 : 하지만 누군가가 중간에 세션ID를 탈취해서 클라이언트인척 위장할 수 있다는 한계는 존재한다.

  • 장점2 : 각 사용자마다 유일한 ID인 세션ID가 발급되므로, 요청이 들어올 때마다 회원 정보를 확인할 필요가 없다.

  • 단점2 : 클라이언트의 인증 정보가 서버에 메모리에 저장되므로 클라이언트의 요청이 많아지면 서버에 부하가 심해진다.

쿠키와 세션의 차이

  쿠키 세션
저장위치 쿠키는 브라우저에 메모리 또는 파일로 저장된다 세션은 서버의 메모리에 저장된다
보안 쿠키는 브라우저에서 확인할 수 있으므로 유출 및 조작 당할 위험이 존재한다 세션은 클라이언트 정보가 서버의 메모리에 저장되므로 비교적 안전하다
라이프 사이클 쿠키는 파일로 저장될 때 브라우저가 종료되어도 정보가 남아있다 세션은 서버의 만료시간/날짜가 지나면 사라지거나 브라우저 종료시 세션ID가 사라진다
속도 쿠키에 정보가 있기 때문에 서버에 요청시 속도가 빠르다 세션은 서버의 메모리로부터 세션ID를 조회해야 하므로 속도가 쿠키보다 비교적 느리다

세션을 주로 사용하면 좋은데, 왜 굳이 쿠키를 사용하는 이유는?

세션은 브라우저가 아닌 서버에 데이터를 저장하므로, 서버의 메모리를 계속 사용하면 속도 저하가 올 수 있기 때문이다.

웹 개발에서 쿠키를 사용할 수 밖에 없는 결정적인 이유

HTTP 프로토콜은 서버가 클라이언트의 상태를 보존하지 않는 무상태성과 연결을 유지시키지 않는 비연결성 특징을 가지고 있다.

즉, 서버가 클라이언트의 요청에 응답을 하는 순간 HTTP 연결은 끊어지며, 클라이언트에서 새로운 요청을 해야 다시 HTTP 연결이 맺어지게 된다.

간단한 웹사이트가 아닌 이상 대부분의 서비스에서는 하나의 브라우저로 부터 순차적으로 들어오는 여러 개의 요청이 동일한 사용자로 부터 오는 것이라는 것을 알아야 한다.

클라이언트와 연결이 유지되지 않는 상황에서 동시에 서버로 유입되는 수많은 요청이 각각 어느 사용자의 것인지 판단하는 것은 서버 입장에서 매우 힘든 일이다.

여기서 쿠키의 지속성이 빛을 발휘하게 된다.

바로 서버가 쿠키를 한 번 브라우저에 저장하면 브라우저는 해당 쿠키를 매 요청마다 계속해서 서버로 돌려 보낸다는 것이다. 다시 말해 서버가 브라우저에 쿠키 하나만 심어 놓으면 그 후로 브라우저는 성실하게 매번 서버를 방문할 때 마다 해당 쿠키를 다시 가져온다.

이러한 쿠키의 특성을 활용하면 서버는 각 요청이 어느 브라우저에서 오는 것인지 어렵지 않게 판단할 수 있다.

예를 들어, 사용자가 서비스에 최초로 접속했을 때 서버가 브라우저에게 a=1 쿠키를 저장하라고 시키면,

HTTP 요청

GET /index.html HTTP/1.1
Host: www.test.com

HTTP 응답

HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: a=1

해당 브라우저는 사용자가 www.test.com 이라는 도메인에 머무는 한 /index.html을 방문하든 /about.html을 방문하든 /contact.html을 방문하든 매번 같은 쿠키를 돌려준다.

그러므로 서버 입장에서는 a=1 쿠키를 들고 들어오는 요청은 모두 이 브라우저로 부터 오는 것이구나라고 쉽게 알 수 있다.

(물론 다른 브라우저에게 a=1 대신에 a=2, a=3와 같은 다른 쿠키를 응답해줘야 한다)

쿠키와 캐시의 차이

  • 쿠키는 사용자를 식별하고 세션을 유지하는 방식 중에서 현재까지 널리 사용하는 방식이다.

  • 쿠키는 캐시와 충돌할 우려가 있으므로 대부분의 캐시나 브라우저는 쿠키에 있는 정보를 캐싱하지 않는다.

  쿠키 캐시
정의 쿠키는 정보를 저장하기 위해 사용된다. 기본적으로 웹서버에서 PC로 보내는 작은 파일들을 저장한다. 보통 쿠키는 누군가 특정한 웹 사이트를 접속할 때 발생한다. 캐시 또한 웹 페이지 요소를 저장하기 위한 임시 저장소이다. 특히, 나중에 필요할 것 같은 요소들을 저장한다.이러한 요소들은 그림 파일이나 문서 파일 등이 될 수 있다.
목적 쿠키는 사용자의 인증을 도와준다. 캐시는 웹 페이지가 빠르게 렌더링 할 수 있도록 도와준다.
삭제 쿠키는 만료기간이 있어 시간이 지나면 자동삭제 된다. 캐시는 사용자가 직접 수동으로 삭제해주어야한다.
예시 유저의 선호도(로그인 정보, 방문기록, 방문횟수) 오디오, 비디오 파일

예상 질문

  • 쿠키를 사용하게게 된 배경은 무엇인가요?

  • 쿠키의 보안 속성에 대해 설명해 주세요.

  • 세션 방식의 로그인 과정에 대해 설명해 주세요.

  • 쿠키와 세션과의 차이점은 무엇인가요?

Reference


Comments

Index