클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 보존함을 의미
합니다.
즉 서버가 클라이언트의 상태(정보)를 기억
하는것 입니다.
기억한다는 말은 어딘가에 정보를 저장하고 통신할때마다 읽는다는 뜻입니다.
예를 들어 로그인을 하면 페이지를 이동해도 로그인이 풀리지않고 계속 유지되는 것이 바로 서버가 클라이언트의 상태를 유지(기억)하고
있으니까 가능한 것입니다.
클라이언트 : 서버님 신라면 하나만 주세요
서버 : 여기요
----- 몇 시간 뒤 -----
클라이언트 : 서버님 아까 산 라면 하나만 더 주세요
서버 : 또 오셨네요~ 신라면 맞죠? 여기요
클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 보존하지 않습니다.
서버가 클라이언트의 상태(정보)를 기억하고 있지 않고, 요청에 대한 응답만 해주고 연결이 끝나는 것 입니다.
클라이언트와 서버간의 통신에 필요한 모든 상태 정보들은 클라이언트에서 가지고 있다가 서버와 통신할때 데이터를 실어 보내는 것이 무상태 구조입니다.
클라이언트 : 서버님 신라면 하나만 주세요.
서버 : 여기요
----- 몇 시간 뒤 -----
클라이언트 : 서버님 아까 산 라면 하나만 더 주세요
서버 : 누구세요?
우선 클라이언트와 서버는 HTTP를 기반으로 통신을 하며, HTTP/HTTPS는 stateless(무상태)을 사용합니다.
그렇다면 서버는 클라이언트의 상태(정보)를 기억하지 못합니다
⇒ 같은 일을 계속 반복하게 됩니다(개발자가 제일 싫어하는 부분)
⇒ 그렇다면 상태(정보)를 기억하게 하면 좋지않을까?
⇒ 그래! 그러면 브라우저에 정보를 저장하자!
쿠키는 크롬이나 사파리 같은 브라우저에 저장되는 작은 텍스트 조각
입니다.
즉 쿠키는 사용자가(브라우저) 갖고 있는 정보
라고 할 수 있습니다.
브라우저에 저장하기 때문에, 사용자가 직접 조작할 수도 있고, 제3자(해커) 또한 이것을 조작 할 수 있습니다(보안에 취약)
따라서 조작되거나, 누군가 훔쳐가도 상관없는 정보들을 저장
합니다.
예를 들어보겠습니다.
쇼핑 사이트에 로그인하지 않아도 장바구니에 물건을 담아두기
⇒ 누가 조작 or 해킹당해도 되는가? (O)
검색 기록에서 이전에 입력했던 검색어들을 찾기
⇒ 누가 조작 or 해킹당해도 되는가? (O)
사이트 팝업설정 : 7일간 현재 페이지 보지 않기
⇒ 누가 조작 or 해킹당해도 되는가? (O)
클라이언트가 페이지를 요청합니다. (사용자가 웹사이트에 접속)
웹 서버는 쿠키를 생성합니다.
생성한 쿠키에 정보를 담아 서버측에서 응답으로 보내줍니다.(민감한 정보는 X)
넘겨 받은 쿠키는 클라이언트(브라우저)가 가지고 있다가 다시 서버에 요청할 때 요청과 함께 쿠키를 전송합니다.
동일 사이트 재방문시 클라이언트의 PC에(브라우저) 해당 쿠키가 있는 경우, 페이지를 요청시 쿠키를 함께 전달합니다.
사용자 정보와 같이 민감한 정보들을 저장하기 위해 사용합니다.
마찬가지로 클라이언트와 서버는 HTTP를 기반으로 통신을 하며, HTTP/HTTPS는 stateless(무상태)을 사용합니다.
그렇다면 서버는 클라이언트의 상태(정보)를 기억하지 못합니다
⇒ 같은 일을 계속 반복하게 됩니다(개발자가 제일 싫어하는 부분)
⇒ 그렇다면 상태(정보)를 기억하게 하면 좋지않을까?
⇒ 그래! 그러면 브라우저에 정보를 저장하자!
⇒ 브라우저에 userid는 wqew11a, 비밀번호는 123456 저장하면 되겠지?
⇒ ???? 🤬
쿠키처럼 정보를 저장하고 싶지만, 사용자의 개인정보와 같이 민감한 정보들은 브라우저에 저장할 수 없습니다. 그렇다고 매번 로그인을 하면 번거롭죠
따라서 세션이란 로그인 여부 등 사용자와 서버의 관계가 기억되어 보존되고 있는 상태를 말합니다.
⇒ stateful
그렇다면 쿠키를 왜쓰지? 세션만 쓰면 되지 않나? 라는 의문이 생겼습니다.
⇒ 세션을 많이 사용하면, 그만큼 서버의 부하가 걸리기 때문에 남발하는 것은 좋지 않습니다. 따라서 적재적소에 맞게 쿠키, 세션에 저장할 정보를 잘 구분하는 것이 개발자의 역량이 아닌가 싶습니다.
예를 들어 보겠습니다.
클라이언트가 페이지를 요청합니다 (사용자가 웹사이트에 접속)
서버는 클라이언트가 보낸 요청의 Header 필드에서 Cookie를 확인하여,
클라이언트가 해당 session-id를 보냈는지 확인합니다.
session-id가 존재하지 않는다면, 서버는 session-id를 생성해 쿠키에 담아서 브라우저로 응답을 보냅니다.
사용자(클라이언트)는 재접속 시, 이 쿠키를 이용하여 session-id 값을 서버에 전달합니다.
쿠키와 세션을 잘 구분해서 저장을 하더라도, 어쨌든 세션id를 저장(보관)해야 하고, 서버에 동시 접속하는 사용자가 많아지면 메모리 공간이 부족
해져서 서버에 부하가 걸리고 화면이 움직이지 않는 등의 문제가 발생할 수 있습니다.
메모리 공간을 많이 차지하는 세션 방식의 대안은 로그인한 사용자에게 세션 아이디 대신 토큰을 발급해 주는 것입니다.
토큰에는 특수한 수학적 원리가 적용되어 있어서 마치 위조 방지 장치가 있는 지폐처럼 서버만이 유효한 토큰을 발행할 수 있습니다.
발행한 토큰은 사용자의 브라우저에 쿠키로 저장합니다.
즉 토큰 방식은 해당 서버만이 만들 수 있는 토큰을 발급함으로써 상태를 서버측에 저장하지 않고도 사용자의 로그인 여부를 파악
할 수 있도록 합니다.
그럼 세션을 사용하지 않고 토큰만 사용하면 되지 않을까? 하는 의문이 생겼습니다.
⇒ 한 번 발행한 토큰은 유효기간이 끝나기 전까지 따로 통제할 수 없습니다.
⇒ 세션에 비해 토큰은 브라우저에 저장하기 때문에 정보를 탈취 당할 가능성이 높습니다. 따라서 민감한 정보들은 세션에 저장 하는것이 좋습니다.
이를 보안하기 위해서 Access Token, Refresh Token를 사용할 수 있습니다.
Access Token : 토큰의 유효기간을 짧게 만들어 위의 2가지 문제를 보완합니다.
Refresh Token : Access Token은 유효 기간이 짧아 사용자 측면에서 잦은 로그인을 해야 합니다. 이를 보완하기 위해 비교적 유효기간이 긴 토큰인 Refresh Token를 통해 Access Token이 만료됐을 때 새로 재발급해줍니다.
이미지, 동영상, 웹 페이지 코드와 같은 대량의 데이터를 서버로부터 전송받습니다. 이러한 데이터 전송에는 시간이 소요될 뿐만 아니라 통신비도 지출됩니다. 고화질 동영상처럼 크기가 큰 데이터일수록 비용은 더욱 커집니다.
만약 한 번 전송받은 데이터는 저장해 놨다가 다시 사용할 때 꺼내 쓴다면 반복적으로 서버에 데이터 전송을 요청할 필요가 없습니다. 이때 사용하는것이 캐시(Cache)입니다.
한 번 전송받은 데이터는 저장해 놨다가 다시 사용할 때 꺼내 쓸 수 있는 기능
캐시는 인터넷 환경뿐만 아니라 다양한 곳에서 사용되는 개념입니다. 컴퓨터의 하드웨어 안에서도 메모리 안에 들어있는 정보를 더 빨리 가져올 수 있도록 하는 CPU 캐시 등이 있습니다.
그렇다면 쿠키랑 뭐가 다른거지? 라는 의문이 생겼습니다
쿠키와 캐시 공통점 : 쿠키와 캐시 모두 정보를 저장하여 재활용하는 기술입니다.
쿠키와 캐시 차이점
쿠키 : 쿠키는 사용자의 수고를 덜어주는 데 목적을 둡니다.
Ex) 유저의 선호도 (로그인 정보, 방문기록, 방문횟수) 등이 있습니다.
캐시 : 데이터의 전송량을 줄이고 서비스 이용 속도를 높이는 데 목적을 둡니다.
Ex) 오디오, 비디오 파일 등이 있다.