로그인은 웹을 공부하다보면 가장 먼저 만나는 부분일 수도 있다. 그만큼 기본적이며 자주사용되는 것이라 판단되어진다. 당시에는 단순히 '구현'에만 신경을 썼다면, 웹 서비스를 이용할때 왜 로그인이 필요한지 부터 쿠키와 세션에 대해서 기록하며 정리하고자 한다.
웹 서비스를 이용하는 클라이언트는 개인적인 컨텐츠를 소유한다. 그러므로 클라이언트는 서버에게 API를 요청했을 때, 서버는 요청한 클라이언트의 식별을 정확히 해야한다. 서버는 개인적인 식별 데이터를 (보안적으로)보관하고 확인이 된다면, 클라이언트의 요청에따라서 정보를 전달해주어야한다. 이러한 일련의 과정이 '인증(Authentication)'이라고 하며, 제대로 이루어지지 않는다면 개인정보 유출 등 심각한 문제가 발생한다.
"쿠키와 세션에 대해서 알아보기로했는데, 갑자기 왠 http?"라고 생각할 수 도있다. 앞서 말했다시피 로그인 과정이 일어나는 과정을 알아보며 쿠키와 세션이 필요한 이유를 설명하기 위해서이다.
먼저 http는 서버와 클라이언트 사이에서 요청(request)/응답(response)이 이루어지는 프로토콜이다. 로그인도 인증이 이루어지기위해서는 클라이언트에서 요청을하고 서버에서 응답을 해주는 과정이 필요하다. 이때, http는 stateless(무상태)라는 특성만 이해한다면, 클라이언트 입장에서는 서버에게 데이터를 요청할때마다 인증을 해야만 한다고 생각할 것이다.
http는 기본적으로 서버의 부담을 줄이기위해서 비연결성과 무상태의 특성을 가진다.
이를 해결하기 위해 쿠키(Cookie)와 세션(Session)을 사용하게 되었다.
웹을 이용하다보면 흔히 쿠키라는 이름을 듣는다. 쿠키는 클라이언트 측에서 로컬 웹 브라우저가 저장하는 데이터다. 인증을 하는 과정에서 처음에 서버는 쿠키를 생성해서 클라이언트에게 보내게된다면, 클라이언트는 쿠키를 웹 브라우저에 Key-Value 형식으로 저장이 된다. 이후 클라이언트가 데이터를 요청시 헤더에 쿠키를 실어서 서버에 보내게된다. 따라서 로그인 정보가 쿠키에 담겨져있다면 더이상의 인증은 필요없게된다.
쿠키의 유효기간은 서버에서 설정하여 보낼수 있다. 유효기간이 지나면 쿠키는 자동으로 소멸된다. 만약 유효기간을 설정하지 않는다면 웹 브라우저를 종료하는 순간 사라진다.
그런데 사실 인증을 여러번 하지않는 큰 이유 중 하나가 보안에 취약하다는 점이다. 서버에게 인증 요청을 하기위해서 네트워크로 개인정보를 보내는데 이를 탈취해 나갈 가능성이 있기때문에 보완점이 필요했다. 우리는 이를 보완하고자 세션(Session)을 사용한다.
나는 세션이 보안적 측면에서 네트워크에 개인정보가 흘러가면 안된다는 점을 고려했을 때 고안된 부분이라고 생각한다. 세션도 쿠키와 동일하게 클라이언트의 인증 상태정보를 저장하게되는데, 쿠키와달리 서버에 저장된다는 차이점이 있다. 또한 외부에서 세션 정보를 열람하여도 개인 로그인 정보와 매칭이 불가능하다는 특징이 있다.
즉 쿠키와 동일하지만, 유출되어도 역으로 확인할 수없는 정보를 담고 있어야한다. 이를 위해서 쿠키를 활용하게되는데, 서버에서 고유 세션 id를 클라이언트에게 보내게되면 이를 클라이언트는 웹 브라우저에 저장하게 된다. 그리고 그 다음부터 인증을 위해서는 클라이언트의 쿠키에 저장되어져있는 고유 세션 id를 서버측에 보내게 된다.
결국 로그인 과정은 다음과 같이 진행된다.
안녕하세요 이제 막 공부를 시작한 초보인데, 포스팅 덕분에 이해가 무척 잘 되었습니다. 감사합니다. 혹시 출처 표기하고 제 블로그에 마지막 로그인 과정 이미지를 첨부해도 괜찮을까요? 여러 대의 서버를 둘 경우 세션 방식 로그인에서 발생할 수 있는 문제점에 대해 공부를 하고 있는데, 그 전에 세션 방식 로그인 과정을 정확히 이해하고 싶어서요, 해당 이미지가 큰 도움이 될 것 같습니다..! 제 블로그는 https://jeongeun1127.tistory.com/ 입니다.
안녕하세요! 포스팅 잘 보고갑니다. 로그인 과정을 설명해준 부분 이미지가 너무 좋아서, 혹시 제 블로그에도 게시해도 될지 여쭙고자 댓글 남깁니다! 허락해주시면, 출처 표기하고 블로그에 기재하도록 하겠습니다~ (제 블로그는 https://creamilk88.tistory.com/ 이런 블로그입니다!)