안녕하세요
앵과장입니다.
오늘도 벌써 2021년 10월이 지나가고 있는 9호선 급행 지하철 입니다.
몇년동안 Frontend 개발에 대해서 진행을 안하다보니 cookie, session, token, jwt에 대해서 빈번하게 사용할 일이없다보니 잠깐 잊고 있던것들에 대해서 가끔씩 이거 맞나 할때쯤 회사에서 네이티브 앱에 있는 기능을 하이브리드 앱으로 변경하면서 회원 정보 공유에 대해서 고민 해야하는 경우가 발생했는데 미리좀 알았더라면 커뮤니케이션 비용이 줄어들수 있었을 텐데 하는 아쉬움이 생겨 정리 합니다.
Cookie 와 Session
Cookie
쿠키는 브라우저 에서 특정 도메인 정보를 호출할때 보내지는 정보 입니다.
Request 정보를 브라우저는 보내고 원하는 정보인 Response정보를 받을수 있습니다.
브라우저에서 다양한 테마 색상 또는 언어팩을 제공할때 Request에 함께 Cookie전달되면 서버는 필요한 정보를 쿠키에서 받아서 처리해주면 됩니다!
이때 서버는 DB조회없이 필요한 테마와 언어 정보등을 원하는 Response 로 처리할수 있는겁니다.
브라우저에서 설정한 정보를 서버에 보내면 서버는 해당정보를 필요하다면 유효시간을 설정에서 브라우저가 처리할수 있도록 합니다.
Cookie 에는 유효한 시간을 설정할수 있어 필요한 시간으로 처리해야 하는 서비스에서도 유용한 활용이 가능합니다.
Cookie 사용팁
Cookie는 유효시간을 설정할수 있다
Cookie는 domain 별로 제한됩니다.내가 A라는 도메인이면 A도메인에 유효라며 B라는 도메인쿠키는 B에서만 유효합니다.
cookie는 개인정보 등 보안상 취약하지 않은 정보들에 대해서 Client 에 특정시간동안 저장해서 사용할수 있는 것들을 가능하게 해줍니다.
Session
Session을 설명하기전에 우리는
Stateless그리고 stateful 대한 이해가 필요합니다
Stateless
Stateless '구조' 는 server의 응답이 client의 세션 '상태'와 독립적입니다.
Stateless 구조에서 server는 단순히 요청이 오면 응답을 보내는 역할만 수행하며, 세션 관리는 client에게 책임이 있습니다.
프로토콜은 Http, UDP 등을 예로 들수 있습니다.
중요한 포인트를 정리하자면 서버로 가는 Client Request 요청이 서로 독립적이라는점 기억하세요!
서버는 클라이언트를 기억하지 않습니다!
Stateful
대표적인 Stateful 구조를 따르는 프로토콜로 TCP가 있습니다.
TCP의 3-way handshaking 과정을 생각해봅시다.
Server와 Client는 3-way handshaking 과정에서 SYN과 SYNACK을 주고 받으며,
양단간 세션 '상태'를 established한 '상태'로 만듭니다.
세션 '상태'가 established가 되면 client와 server는 데이터를 주고 받을 수 있습니다.
이렇게 TCP는 세션 '상태'에 따라 Server의 응답이 달라지는 Stateful 프로토콜입니다.
Session 이란
회원 서비스를 가정하고
1. 최초 클라이언트가 Id, password 를 요청
2. 서버는 회원정보를 Session 저장소에 있는지 여부를 검색
3.없다면 회원 DB에서 조회한뒤 Session 저장소에 추가후 SessionID값을 클라이언트에게 전달합니다.
4.전달받은 Cookie해더에 전달된 Session 저장소에서 sessionID값을 확인후 그때 서버는 어떤회원인지 인지하게 됩니다.
5.그이후 다른페이지 이동하게되면 2~4 절차가 지속적으로 수행하면서 서버는 해당 회원정보를 인지하게됩니다.
서버가 이중화 되어있다면 Session이 생성된 서버로 전달해주는 방식은 로드밸런싱중 Sticky 방식으로 동작하게 됩니다.