[ReSeller Project] Stateless한 HTTP가 로그인하는 방법

홍정완·2022년 9월 4일
0

ReSeller Project

목록 보기
8/15
post-thumbnail

HTTP란 ❓


HTTP는 클라이언트와 서버 구조로 되어있다.

이러한 HTTP는 비 연결성(Connectionless)무상태(Stateless)라는 특성을 가진다. 비연결성이란 클라이언트가 요청(request)을 하고, 서버가 해당 요청에 응답(response)를 보내면 연결을 끊는 성질을 의미한다. 이러한 특성 때문에 1시간 동안 수천 명 이상이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십 개 이하로 적다.



무상태(Stateless)


비연결적인 특성으로 연결이 해제됨과 동시에 서버와 클라이언트는 클라이언트가 이전에 요청한 결과에 대해서 잊어버리게 된다. 즉, 클라이언트가 이전 요청과 같은 데이터를 원한다고 하더라도 다시 서버에 연결을 하여 동일한 요청을 시도해야 한다.


HTTP는 이러한 특성으로 인해 Stateless Protocol이라고 불리며, 독립적인 요청과 응답을 처리함으로 단순하고, 상태를 저장해야 하는 서버의 부담을 감소시킬 수 있고, 스케일 아웃 - 수평 확장에 유리하다.

HTTP가 ConnectionlessStateless라는 특성을 갖는 건 알겠는데 상태가 서버에 저장되어 있지 않는다면 인증은 어떻게 구현해야 할까 ❓


쿠키와 세션을 이용하면 서로의 연결성과 상태 유지하지 않는 서버와 클라이언트를 로그인 처리할 수 있다.



쿠키(Cookie)


쿠키는 클라이언트가 보관하는 데이터다.
서버는 쿠키를 생성하여 클라이언트에 정보를 전송할 수 있다. 쿠키는 key-value 형태로 클라이언트의 쿠키 저장소에 저장된다. 서버로부터 쿠키를 전달받은 클라이언트는 이후 서버에 요청을 보낼 때 쿠키를 헤더에 실어서 함께 전송한다. 이를 이용하면 서버와 클라이언트는 필요한 값을 공유하고 상태를 유지할 수 있다.

클라이언트에 보관된 쿠키는 유효기간 설정이 가능한데 특정 시간이 지나면 자동으로 쿠키를 소멸시킬 수 있다. 유효기간을 설정하지 않을 시에는 클라이언트 종료와 함께 소멸한다.

하지만 쿠키만으로 로그인을 구현하는 것은 한계가 있다. 쿠키는 네트워크를 통해 전달되기 때문에 중간에 쿠키를 탈취할 수 있다는 취약점이 있다. 이를 보완하고자 우리는 세션(Session)을 사용한다.



세션(Session)


세션도 마찬가지로 클라이언트의 상태를 저장할 수 있다. 쿠키와 다른 점은 쿠키는 각 클라이언트의 별도 쿠키 저장소에 저장되는 반면에 세션은 서버에 저장된다.

클라이언트는 각각 별도의 세션을 갖는다. 각 세션을 구분하기 위해 고유 ID를 할당하고, 서버는 각 클라이언트에 세션 ID를 전송한다. 클라이언트는 서버에 연결 시 매번 세션 ID를 보내서 서버가 어떤 세션을 사용할지 알 수 있도록 한다. 이때, 서버와 클라이언트가 세션 ID를 주고받기 위해 사용하는 것이 쿠키다.


우리는 로그인 정보를 웹 컨테이너 메모리의 세션 객체에 저장하게 되고, 클라이언트는 세션 ID를 전송하여 클라이언트 고유 세션을 식별하게 된다. 이후 세션 객체 내부에 로그인 여부를 확인할 수 있는 특정 속성이 존재하면 로그인한 것으로 판단할 수 있다.

아래 그림을 보면 클라이언트와 서버가 세션과 쿠키를 이용하여 어떻게 로그인 인증 절차를 가지는지 확인할 수 있다.



정리


  • HTTP는 비 연결성(Connectionless)무상태(Stateless)라는 특성을 지님으로 멀티 스레드 환경에서 웹 애플리케이션이 많은 요청과 응답을 할 수 있게 한다.

  • 웹 애플리케이션은 상태를 유지해야 하는 서비스가 존재한다.
    대표적으로 로그인 기능이다.

  • 세션쿠키를 사용하면 HTTP의 한계를 극복하고 로그인을 구현할 수 있다.

profile
습관이 전부다.

0개의 댓글