<h1><center> 쿠키와 세션 </center></h1> ###### tags: `💻 TIL`, `Computer Science`, `Network` ###### date: `2024-02-05T15:12:33.284Z` > [color=#724cd1][name=데릭] <br> > [Nossi.DEV - 쿠키와 세션 차이점](https://www.nossi.dev/c630d26d-6ccb-4637-918a-c2396d74f1bd) <br> > [Nossi.DEV - 쿠키와 세션을 이용한 로그인 방식](https://www.nossi.dev/9a5d7124-ae80-4dbd-8678-fffc3911728d) <br> > [쿠키와 세션 개념](https://interconnection.tistory.com/74)<br> ## HTTP의 특징과 쿠키 & 세션을 사용하는 이유 ![image](https://hackmd.io/_uploads/H1dq_J05p.png) > HTTP의 특성이자 약점을 보완하기 위해서 쿠키 또는 세션을 사용한다. 기본적으로 HTTP 환경은 `connectionless`, `stateless`한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야 한다. 이런 특성을 보완하기 위해 쿠키와 세션을 사용한다. **NOTE** > Connectionless: 클라이언트가 Request한 후 Response를 받으면 그 연결을 끊어 버리는 특성이다. HTTP는 Client가 Request를 서버에 보내면, 서버는 Client에게 요청받은 Response를 보내고 접속을 끊는 특성이 있다. <br> Header에 keep-alive라는 값을 줘서 커넥션을 재활용하는데 HTTP1.1에서는 이 기능이 Default이다. HTTP가 TCP위에서 구현되었기 때문에 네트워크 관점에서 kee-alive는 옵션으로 Connectionless의 연결 비용을 줄이는 것을 장점으로 비연결 지향이라고 한다.<br> > stateless: 통신이 끝나면 상태를 유지하지 않는 특성이다. 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성을 말한다. 쿠키와 세션은 위의 두 가지 특성을 해결하기 위해 사용한다. 예를 들어, 쿠키와 세션을 사용하지 않으면 쇼핑몰에서 옷을 구매하려고 로그인 했음에도, 페이지를 이동할 때마다 로그인이 유지되지 않는 상황을 말한다. 하지만, 쿠키와 세션을 사용할 경우, 한 번 로그인하면 어떠한 방식에 의해 그 사용자에 대한 인증을 유지한다. ## HTTP 쿠키 ![image](https://hackmd.io/_uploads/B1tw5yRqT.png) > 하이퍼 텍스트의 기록서(HTTP)의 일종으로 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 사용자의 컴퓨터나 다른 기기에 설치되는 작은 기록 정보 파일을 일컫는다. 쿠키의 생성과 저장은 구현에 따라 다르지만 원리는 동일하다. 1. 서버가 클라이언트로부터 요청을 받았을 때, 클라이언트에 관한 정보를 토대로 쿠키를 구성 2. 서버는 클라이언트에게 보내는 응답의 Header에 쿠키를 담아 보냄 3. 클라이언트가 응답을 받으면, 브라우저는 쿠키를 쿠키 디렉토리에 저장 ## 세션 ![image](https://hackmd.io/_uploads/SJvRq1R56.png) > 기본적으로 쿠키를 이용해 구현된다. 클라이언트를 구분하기 위해 각 클라이언트에게 Session ID를 부영하고 클라이언트는 쿠키에 Session ID를 저장한다. 사용자 정보를 브라우저에 저장하는 쿠키와 달리 세션은 서버에 정보를 저장하여 관리한다. 세션은 유효시간을 두고 일정 시간 응답이 없다면 끊을 수 있고, 브라우저가 종료될 때까지 인증상태를 유지할 수 있다. 사용자 정보를 서버에 두기 때문에 쿠키보다 보안은 좋지만, 서버 자원을 차지하기 때문에 서버에 과부하를 줄 수 있고 성능 저하의 요인이 될 수 있다. **세션이 보안도 좋은데 쿠키를 사용하는 이유는?** 클라이언트 측에 정보를 저장하여 상태를 유지하기 때문에 서버의 과부하를 줄일 수 있다. 그리고 사용자가 웹사이트를 떠나도 쿠키는 브라우저에 저장되어 영구적으로 상태를 유지할 수 있다. 일반적으로 세션은 브라우저를 닫으면 종료되지만, 쿠키는 만료 날짜를 설정하여 오랫동안 유지할 수 있다. 또한, 쿠키는 사용자 지정 설정이나 선호도 같은 정보를 저장하는 데에도 활용된다. 세션은 주로 인증 정보와 같은 민감한 데이터를 안전하게 관리하는 데 중점을 둔다. **쿠키의 사용 예를 아는대로 말하라** 1. 상태 유지(State Persistence): 로그인 상태, 선호 설정, 장바구니 등을 저장하여 사용자 경험을 향상시킴 2. 사용자 추적 및 분석: 사용자의 행동을 기록하고 추적하여 웹사이트 성능을 개선하거나 타겟팅된 광고를 제공 3. 언어 및 지역 설정: 사용자가 웹사이트에서 선호하는 언어 및 지역 설정을 저장하여 해당 설정에 맞는 콘텐츠 제공 4. 광고 타겟팅: 쿠키를 활용하여 사용자의 광고 선호도를 파악하고 타겟팅된 광고를 제공 5. 인증 및 보안: 세션 관리에 사용되어 사용자를 인증하고 보안을 강화 6. 사용자 맞춤 서비스: 쿠키를 통해 사용자에게 개인화된 환경을 생성하여 맞춤형 콘텐츠나 서비스를 제공 ### 쿠키와 세션을 사용해 인증(Authentication) & 인가(Authorization) ![image](https://hackmd.io/_uploads/SyGfhy0ca.png) 인증(Authentication)은 사용자가 누구인지 확인하는 절차이다. 회원가입과 로그인 과정이 인증의 대표적인 예시다. 인가(Authorization)는 사용자가 요청하는 것에 대한 권한이 있는지 확인하는 절차이다. **세션을 사용한 인증, 인가의 절차** 1. 클라이언트가 로그인 하면 서버는 회원정보를 대조하여 인증한다. (`Authentication`) 2. 회원 정보를 Session Storage에 생성하고 Session ID를 발급 3. HTTP Response Header 쿠키에 발급한 Session ID를 담아서 보낸다. 4. 클라이언트에서 Session ID를 쿠키 저장소에 저장하고 이후에 HTTP Request를 보낼 때마다 쿠키에 Session ID를 담아서 보냄 5. 서버에서는 쿠키에 넣어서 온 Session ID에 해당하는 회원 정보를 Session Storage에서 가져온다. (`Authorization`) 6. 응답 메세지에 회원 정보를 바탕으로 처리된 데이터를 담아서 클라이언트에 보냄 사용자가 로그인 하면 서버는 Session ID를 쿠키에 넣어 클라이언트에게 보낸다. 클라이언트는 Session ID를 요청할 때마다 헤더에 담아서 보내면 서버는 Session ID에 해당하는 클라이언트 정보를 Session Storage에서 가져온다. 이를 통해, 클라이언트 정보에 따라 맞춤 Response를 할 수 있게 된다. 하지만, 서버에서 Session Storage를 사용해 사용자 데이터를 저장해야 하기 때문에 추가적인 저장공간이 필요하다. Session ID만 쿠키에 넣어서 Request를 하기 댸문에 요청할 때마다 사용자 정보를 쿠키에 담아서 전송하는 것보다 안전하다. 하지만, Session ID만 노출되어 악의를 가진 다른 사용자가 이를 이용해 서버에 요청하게 되면 서버는 구별할 수 없게 된다. 이게 **Session Hijacking**이라고 한다. 해결책은 HTTPS를 사용하거나 Session에 짧은 주기로 만료시간을 설정하는 방법이 있다. 또한, 세션과 쿠키를 이용한 로그인 방식은 Load Balancing 및 서버 효율성 관리 및 확장이 어려워질 수 있다는 단점이 있다.