클라이언트에서 서버에 로그인 요청을 보내고 서버에서 로그인의 성공 응답을 보내주는 로그가 있다고 가정해보자.
로그인 인증정보가 맞다면 사용자는 화면에서 로그인을 성공했다는 화면을 확인 할 수 있다. 그런데 우리는 서버로부터 로그인 성공 화면 외에도 다른 것들을 받는다. 그 대표적인 것으로 쿠키(cookie)가 있다.
쿠키
쿠키는 서버에서 클라이언트로 보내져서 브라우저에 저장되는 아주 작은 크기의 데이터이다.
쿠키는 속성을 나타내는 키와 그 속성에 해당되는 값을 가지고 있으며, 명시된 유효기간이 만료된 시점에 브라우저에서 삭제되는 특징을 가지고 있다.
우리가 로그인을 성공한 이후의 작업을 가정해보자. 쇼핑사이트를 예시로 들면 장바구니를 이동하거나 여러 물품을 검색하거너ㅏ 개인정보를 수정하는 등 페이지를 이동할 것이다. 클라이언트가 자유롭게 페이지를 이동하며 여러가지 자원을 활용할 수 있는 이유는 로그인을 성공하여 회원임을 인증하였기 때문이다. 그러나 장바구니에 이동하는 회원이 로그인을 성공했다는 것을 클라이언트와 서버가 요청 자체는 기억하지 못한다. HTTP 통신에서는 각각의 요청과 응답이 독립적이다. 그렇기 때문에 이전의 작업을 기록하지 못한다. HTTP는 각각의 요청과 응답이 종료되었을 때, 연결이 지속되지 않고 상태를 기억하지 않는다는 특징을 가지고 있는데 이것을 Stateless 혹은 무상태성이라고 한다. 수천 명, 수만 명이 동시에 서버에 접속하면 거대한 컴퓨팅 리소스를 하게 되며 서버가 온전히 버틸 수 없는 상태가 될 것이다. 그렇기 때문에 Stateless 속성이 리소스 측면에서는 효율적이다. 그리고 요청을 어딘가에 남기기 위해 고안된 것이 바로 쿠키이다.
서버가 클라이언트에게 작업을 성공해서 데이터를 보내겠다는 쿠키를 보내면, 쿠키를 받은 클라이언트는 로그인을 하고 다른 페이지로 이동해도 로그인이 풀리지 않게 된다. 쿠키가 없었다면 페이지를 이동할 때마다 로그인을 해야할 것이다. 브라우저에 저장된 쿠키에 의해 클라이언트는 로그인 했거나 장바구니에 물건을 추가하는 등 서버와 있었던 작업들을 받게 되고 서버는 다시 클라이언트에서 보낸 쿠키 정보에 따라 작업을 기억하고 다시 브라우저에 내용을 띄워주는 역할을 한다.
그러나 쿠키는 취약점이 노출되거나 악의적인 공격에 악용될 수 있어 민감한 데이터들은 최대한 남기지 않도록 해야한다. 서버에서만 쿠키값을 조작할 수 있도록 하는 httpOnly 옵션이나 보안연결에서만 쿠키값을 전송하는 secure를 활용하는 것이 좋다. 해킹이나 사용자 변조, 위장의 피해가 발생하지 않도록 하기 위해 개발자로 하여금 쿠키를 적절하게 활용하는 것이 중요하다.
세션
쿠키의 한계점을 보안하기 위해 나온 개념이다.
클라이언트에서 로그인 요청을 보내고 성공하게 되면 서버에서는 여러가지 정보들을 주는 것이 아니라 세션 아이디만 쿠키에 실어보낸다. 클라이언트의 상태를 나타내는 나머지 쿠키 데이터들은 서버 측의 세션 저장소에서 가지고 있는다. 클라이언트에서 불필요한 민감 정보나 보안에 접촉되는 데이터를 담지 않고 서버에서 세션 아이디를 받고 그 세션 아이디에 해당되는 정보를 찾아 활용하게 된다.
만약 로그인 이력이 있는 브라우저에서 다시 로그인 요청을 하게 되면 서버에서 세션 아이디가 세션 저장소에 있는지 먼저 찾아보고 아이디가 있다면 거기에 저장된 상태 데이터들을 기반으로 클라이언트에 응답한다.
세션은 민감한 정보가 클라이언트에 저장되거나 노출되어 변조되는 것을 방지하고 클라이언트가 매번 요청 시에 쿠키값을 보내는 리소스 비용을 절감한다. 그런데 세션 저장소는 서버 측 입장에서는 또하나의 비용이 들 수 있다. 그래서 서버 측에서 세션 저장소를 운용하는 가용성과 설계가 서버 성능에 영향을 미치거나 운영비에 변동을 줄 수 있다.
'Back-End > Java' 카테고리의 다른 글
Spring Boot (0) | 2023.05.26 |
---|---|
IP와 Port 그리고 DNS (0) | 2023.05.25 |
HTTP 통신과 URL (0) | 2023.05.23 |
Web - 클라이언트와 서버 (0) | 2023.05.22 |
예외 - 예외 처리 (0) | 2023.05.19 |