쿠키와 세션에 대해 설명해주세요.
분야: 프론트엔드
쿠키와 세션은 클라이언트와 서버 간의 상태를 유지하기 위해 사용하는 대표적인 방식들입니다. 웹은 기본적으로 상태를 저장하지 않는 Stateless한 구조이기 때문에, 사용자의 로그인 정보나 장바구니와 같은 클라이언트 정보를 유지하려면 별도의 상태 관리 방식이 필요합니다. 이때 주로 활용되는 방식이 쿠키와 세션입니다.
먼저, 쿠키는 클라이언트 측에 저장되는 데이터입니다. 서버가 클라이언트에게 응답할 때 Set-Cookie 헤더를 통해 데이터를 전달하고, 이후 클라이언트는 요청 시 해당 쿠키를 자동으로 포함하여 서버로 전송하게 됩니다. 쿠키는 브라우저에 저장되기 때문에 서버에서는 별도의 저장 공간을 차지하지 않으며, 지속적인 상태 유지가 가능합니다. 유효 기간을 설정하여 자동 만료되도록 할 수도 있습니다. 쿠키는 클라이언트 측에 상태를 저장하기 때문에 서버는 세션처럼 별도의 저장소를 유지하지 않아도 된다는 장점이 있습니다. 하지만 탈취될 경우 쿠키에 포함된 개인정보가 노출되는 보안 상 단점이 존재합니다.
반면 세션은 서버 측에 저장되는 데이터입니다. 사용자가 서버에 처음 인증을 수행할 때 고유한 세션 ID가 생성되고, 이 ID가 클라이언트에 전달됩니다. 이후 클라이언트는 이 세션 ID를 서버로 전송하며, 서버는 해당 ID를 통해 사용자 상태 정보를 조회합니다. 세션은 서버에 저장되기 때문에 보안 면에서 쿠키보다 안전하지만, 서버 자원을 차지하고 확장에 불리하다는 단점이 있습니다.
쿠키 대신 LocalStorage나 SessionStorage를 사용해도 되지 않나요?
말씀하신대로 LocalStorage와 SessionStorage는 모두 브라우저에 데이터를 저장하는 방식으로, 쿠키와 유사한 점이 있습니다.
하지만 자동으로 서버에 전송되지 않는다는 차이점이 있습니다. 또한, 두 저장소는 자바스크립트를 통해 접근이 가능하므로 XSS에 더욱 취약할 수 있습니다. 반면, 쿠키는 매 요청에 자동으로 포함되며 HttpOnly 설정을 통해 XSS를 예방할 수 있습니다. 따라서 인증 상태를 관리할 때에는 쿠키를 사용하는 경우가 많습니다.
로그인 구현 시 세션 방식은 주로 어떤 경우에 채택하나요?
보안의 중요도가 높은 서비스에서 많이 사용합니다. 세션 ID는 서버에 저장되고 클라이언트에는 참조만 전달되어 토큰 기반 방식보다 탈취 시 위험성이 낮고, 대응에도 용이합니다.
또한, 원격 로그아웃 기능이 필요한 경우에도 사용됩니다. 예를 들어, 동시 로그인 가능 기기 수를 제한해야 하거나, 강제 로그아웃을 구현해야 하는 경우가 있습니다. 이처럼 서버 측에서 사용자별 로그인 상태를 관리해야 하는 경우 유용하게 활용될 수 있습니다.
다만, 서버 자원을 많이 사용하고 분산 시스템에서는 세션 동기화가 필요하다는 단점이 있으므로 트레이드 오프를 고려하여 선택해야 합니다.