HTTP프로토콜의 특징이자 약점을 보완하기 위해서 쿠키와 세션을 쓰곤 합니다.
HTTP프로토콜 환경에서 서버는 클라이언트가 누구인지 확인해야 하는데, 그 이유는 HTTP프로토콜이
connectionless, statless 한 특성이 있기 때문입니다.
connectionless(비연결성)란?
클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징입니다.
이러한 비연결적인 상태를 유지하는 까닭은 HTTP는 인터넷 상에서 불특정 다수와 통신하기 때문에
서버에서 다수의 클라이언트와 연결을 계속 지속해야한다면 이에 따라 많은 비용이 발생하게 됩니다. 이를 줄이면 더 많은 연결을 할 수 있으므로 conectionless한 특징을 지닙니다.
물론 이 방식의 단점도 존재합니다.
서버가 클라이언트를 기억하고 있지 않으므로, 동일한 클라이언트의 모든 요청에 대해 매번 새로운 연결 시도/해제의 과정을 거쳐야 하므로 연결/해제에 대한 시간이 더 낭비된다는 측면이 있습니다.
해결책으로 이러한 낭비를 줄이기 위해 HTTP의 KeepAlive속성을 사용하게 됩니다.
KeepAlive는 지정된 시간동안 서버와 클라이언트 사이에서 패킷 교환이 없을 경우 상대의 통신 여부를 묻기 위해 패킷을 주기적으로 보내는것인데 패킷에 반응이 없으면 접속을 끊는다고 합니다.
Stateless(무상태)란?
Connectionless로 인해 서버는 클라이언트를 식별할 수 없는데 이를 Stateless라고 합니다.
클라이언트가 누군지 식별하지 못한다는 것은 가령 다음과 같습니다.
1. 웹사이트 접속
2. 로그인
3. 게시판 확인
4. 게시글 작성 버튼 클릭
5. 로그인
6. 게시글 수정 클릭
7. 로그인
이렇게 계속 새로운 인증을 처리해야하는거죠.
이를 보완하기 위해 상태를 기억하는 방법으로 쿠키와 세션이 도입되었는데
쿠키와 세션을 사용했을 경우 한 번 로그인을 하면 그 사용자에 대한 인증을 유지하게 됩니다.
쿠키
먼저 쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 데이터파일입니다. 브라우저마다 저장되는 쿠키가 다르기 때문에 서버에서는 브라우저가 다르면 다른 사용자로 인식하게 됩니다.
쿠키는 서버를 대신해서 이 정보들을 웹 브라우저에 저장하고 사용자가 요청할 때 쿠키를 함께 보내서 서버가 사용자를 식별할 수 있게 합니다. 쿠키는 일정시간동안만 데이터를 저장할 수 있으므로 시간이 제한된 로그인 상태 유지 같은곳에서 쓰입니다.
쿠키의 구성요소는 이름(각각의 쿠키를 구별하는데 사용되는 이름), 값(쿠키의 이름과 관련된 값), 유효시간(쿠키의 유지시간), 도메인(쿠키를 전송할 도메인), 경로(쿠키를 전송할 요청경로)로 이루어져 있습니다.
쿠키의 동작방식은 다음과 같습니다.
1. 클라이언트가 페이지를 요청합니다.
2. 서버에서 쿠키를 생성합니다.
3. 서버는 HTTP헤더에 쿠키를 포함시켜 응답합니다.
4. 브라우저가 종료되어도 쿠키 만료시간이 지나지 않았다면 클라이언트 측에서 쿠키를 계속 보관하고 있습니다.
5. 클라이언트 측에서 같은 요청을 할 경우 HTTP헤더에 쿠키를 함께 보냅니다.
6. 서버에서 쿠키를 받아 상태 정보를 변경할 필요가 있으면 쿠키를 업데이트 해서 변경한 쿠리를 HTTP헤더에 포함시켜 응답합니다.
쿠키의 단점은 서버가 가지고 있는게 아니라 클라이언트측에 저장되기 때문에 임의로 고치거나 지울수도 있고 가로채기도 쉬워 보안이 취약합니다. 그렇기 때문에 쿠키에 중요한 정보를 담는 것은 아주 위험하지요.
이러한 단점을 보완하는 것이 바로 세션입니다.
세션
세션은 쿠키를 기반으로 하고 있지만 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버측에서 관리합니다. 서버에서는 클라이언트를 구분하기 위해 각각의 세션 ID를 발급하며 웹 브라우저가 서버에 접속해서 종료를 요청할때까지 인증상태를 유지합니다.
세션의 동작방식은 다음과 같습니다.
1. 클라이언트가 서버에 접속 시 세션 ID를 발급받습니다.
2. 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 지니고 있습니다.
3. 클라이언트는 서버에 요청할때 이 쿠키의 세션 ID를 서버에 전달해서 인증을 합니다.
4. 서버는 받은 세션 ID로 세션에 있는 클라이언트 정보를 가져옵니다.
5. 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답합니다.
세션의 단점으로는 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다는 보안이 좋지만 사용자가 많아질 수록 서버 메모리를 많이 차지하게 된다는 단점이 있습니다.
-> 쿠키와 세션의 문제점들을 보완하기 위해 토큰 기반의 인증 방식이 도입되었습니다.
토큰 기반의 인증 방식의 핵심은 보호할 데이터를 토큰으로 바꾸어 원본데이터 대신 토큰을 사용하는 기술입니다. 대표적으로 OAuth와 JWT가 있습니다.
쿠키와 세션의 차이
저장위치 : 쿠키는 클라이언트에 txt파일로 저장되지만 세션은 서버에 저장됩니다.
보안 : 쿠키는 클라이언트 로컬에 저장되기 때문에 악의적으로 변경되거나 요청할때 가로채질 우려가 있어서 보안에 취약합니다. 그러나 세션은 쿠키를 이용해서 세션id만을 저장하고 이 세션 id를 통해 서버에서 처리하기 때문에 쿠키보다는 보안성이 좋습니다.
생명주기 : 만료시간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속해서 정보가 남아있을 수도 있습니다. 만료기간을 아주 넉넉하게 설정하면 쿠키를 직접 삭제할때까지 남아있을 수도 있습니다. 세션 같은 경우는 만료기간을 정할 수 는 있지만 브라우저가 종료되면 그에 상관없이 삭제됩니다.
속도: 쿠키에 정보가 담겨있기 때문에 서버에 요청시 속도가 빠릅니다. 세션은 정보가 서버에 있기 때문에 처리가 요구되어 비교적 느립니다.
'CS > Computer Network' 카테고리의 다른 글
CORS란? (0) | 2021.07.25 |
---|---|
RESTful이란? (0) | 2021.07.18 |
HTTP 메서드와 그 역할 (2) | 2021.07.04 |
HTTP와 HTTPS 그리고 SSL HandShake (0) | 2021.06.28 |
TCP 3 WAY, 4WAY HANDSHAKE (0) | 2021.06.27 |