Next.js를 숙달을 위해 당근마켓 클론 코딩을 진행하던 중 지금까지는 JWT를 사용해 왔기때문에 세션 방식을 이용한 로그인을 적용하려고 하였다. 그동안 헷갈렸던 부분들을 정리하기위해 블로깅해보려고 한다.
로그인방식으로 바로 들어가기 전에 HTTP의 특징을 알아야, 세션방식과 토큰방식이 어떻게 다른지, 왜 사람들이 이렇게 두 방식으로 나누었는지를 제대로 이해할 수 있다.
Connectionless란 서버의 요청과 응답이 모두 일어난 이후에는 TCP/IP연결을 유지하지 않는 것이다. 이를 통해 서버의 자원을 효율적으로 관리하고, 수 많은 요청과 응답을 처리할 수 있다.
ps. 응답, 요청이후 새로 연결 될때 3-way handshake과정이 다시한번 반복되어야 하기 때문에 웹 사이트의 콘텐트가 늘어나면서 TCP 연결의 재사용이 필요하였고, Persistent Connection 기술이 나오게 되었다. HTTP/1.1버전부터 Connection:keep-alive를 헤더에 보내는 방식으로 Persistent Connection을 지원하였으며, HTTP/2 버전부터는 멀티플렉싱 기능을 통해 단일 TCP 연결을 통한 다수의 HTTP요청과 응답이 클라이언트와 서버사이의 응답 지연없이 Stream형태로 주고 받을 수 있게 되어 Persistent Connection의 고민을 덜었다.
stateful 서버란 클라이언트의 요청을 받을 때마다 그 클라이언트의 상태를 계속해서 유지하고, 서비스 제공에 이용하는 것이다.
반대로 상태를 유지하지 않는 것을 stateless라고 한다. 이전 상태정보를 저장하지 않으면서 서버는 클라이언트측에서 들어오는 요청만으로 작업을 처리한다. 이 때 결합도가 낮아 서버의 확장성이 높아진다.
아래의 예제를 보고 stateless의 의미를 확실히 이해할 수 있었다.
stateful
승객: 서울에서 전주 가는 KTX는 얼마인가요?
직원: 25,000원입니다.승객: 2장 주세요.
직원: 50,000원입니다. 결제는 무엇으로 하시겠습니까? (KTX 노선과 주문 수량에 대한 상태를 유지)승객: 체크카드입니다.
직원: 결제과 완료되었습니다. (KTX 노선과 주문 수량, 결제 수단에 대한 상태를 유지)
stateless
승객: 서울에서 전주 가는 KTX는 얼마인가요?
직원: 25,000원입니다.승객: 2장 주세요.
직원: ??? 무엇을 2장 구매하시는 건가요???승객: 아까 말했잖아요😳. 서울에서 전주 가는 KTX요!!!
직원: 몇 장인지, 결제 수단은 무엇인지 한 번에 얘기해주세요!
http의 특징 중 하나인 stateless에서 stateful하도록 만든 것이 세션을 이용한 방법이다. 서버에서 유저의 로그인 상태를 관리하는 인스타그램, 페이스북 같은 경우도 세션을 통해 유저의 상태를 확인한다.