드림핵 자료를 토대로 정리 한 것
이번 코스에서는 HTTP 통신에 쓰이는 쿠키와 세션에 대해 설명한다.
• 서론
• Connectionless
• Stateless
• 쿠키 (Cookie)
• 세션 (Session)
.
.
.
• 배우고 나서 내가 이해한대로 정리
서론
웹 서버는 대부분 로그인을 통해 개인만의 서비스를 제공한다.
손님 계정에겐 손님을 위한 서비스 , 관리자 계정에겐 관리페이지, 데이터베이스 등 관리자를 위한 페이지를 제공해야한다.
그럼 웹 서버는 누가 누군지 알고 결과를 다르게 제공할까?
저번에 배웠듯이 클라이언트에서 서버에 보내는 요청에 따라 다르게 반환을 해주는데
이때 클라이언트에서 서버에 요청을 보낼때 요청 안에는 클라이언트의 정보와 인증 정보 또한 들어있다.
- 클라이언트의 정보: 이는 클라이언트에 대한 일반적인 정보를 의미합니다. 예를 들어, 클라이언트의 IP 주소, 브라우저 종류, 운영 체제 등과 같은 정보가 포함될 수 있습니다. 이러한 정보는 헤더에 포함되어 웹 서버로 전송되며, 서버는 이를 통해 클라이언트에 대한 기본적인 정보를 파악할 수 있습니다.
- 클라이언트의 인증 정보: 이는 클라이언트가 자신의 신원을 인증하기 위해 제공하는 정보입니다. 보통은 사용자의 아이디와 비밀번호 또는 액세스 토큰과 같은 인증 토큰이 인증 정보로 사용됩니다. 클라이언트가 인증 정보를 헤더에 포함하여 요청을 보내면, 웹 서버는 해당 정보를 확인하여 클라이언트의 신원을 인증하고, 요청을 처리합니다. 이를 통해 보안과 접근 제어를 강화할 수 있습니다.
이번엔 이 클라이언트의 인증 정보를 포함하고있는 쿠키 (cookie) 와 세션 (Session)에 대해서 알아본다.
쿠키
웹 서버는 클라이언트를 기억하지 못한다.
왜냐?
1. 클라이언트의 IP 주소와 user agent 는 언제든지 변경될 수 있는 고유하지 않은 정보이기 때문이다.
( User Agent ? - 클라에서 서버로 요청을 보낼때 자신의 소프트웨어와 버전정보 등을 보내는 헤더 )
2. HTTP 프로토콜의 Connectionless 와 Stateless 특징 때문이다.
( Connectionless ? - 클라이언트와 서버의 요청과 응답이 독립적으로 처리되고 일회성으로 이루어지는 특징
한번의 요청과 응답이 지나가면 연결을 끊고 새 요청이 들어오면 다시 새연결을 해서 처리 후 다시 끊음)
( Stateless ? - 통신이 끝난 후 상태 정보를 유지하지 않는다는 것을 의미한다. 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없음. )
이러한 이유들 때문에 웹 서버는 클라이언트를 기억하지 못하는데 이러한 HTTP 환경에서 상태를 유지하기 위해 쿠키가 탄생했다.
서버에서 각 클라이언트에게 쿠키를 발급한다.
클라이언트는 발급받은 쿠키를 브라우저에 저장하고,
그 후 클라이언트에서는 서버에게 요청을 보낼때마다 쿠키를 같이 전송한다.
서버에서는 같이 전송된 쿠키를 통해 클라이언트를 구분한다.
서버에서 클라이언트를 왜 기억해야해? 기억안해도 잘 연결되잖아? 그리고 클라이언트를 구분해서 뭐하게?
주로 쿠키는 정보 제공 편의성 과 상태정보를 위해 만들어진 것 이다. 쿠키로 인해 할 수 있게 된 것들.
정보제공
1. 세션 유지 : 로그인 했던 웹 사이트를 떠나고 후에 다시 돌아왔을때 (쿠키가 유지되어있는 상태까지만) 로그인이 유지 되어있다. 이로인해 사용자는 매번 로그인을 안해도 됨.
2. 개인화 : 사용자의 선호도나 이전 활동에 기반하여 개인화된 서비스를 제공 할 수 있음.
예시로 웹 사이트에서 '리그오브레전드'라는 게임영상을 주로 시청했을때 추천 알고리즘에 '리그오브레전드' 게임 영상 위주로 추천이 되고, 웹 페이지에 들어가면 뜨는 광고 팝업창의 '오늘 하루 더이상 보지 않기' 를 누르면 다시 웹 페이지에 들어왔을때 광고 팝업창이 뜨지 않음'
이렇듯 상향화된 서비스를 제공 할 수 있음.
상태정보
서버는 각 클라이언트마다 이러한 정보제공을 다르게 제공하는데
서버는 수많은 클라이언트를 구분하기 위해 클라이언트를 식별 할 수 있는 값을 쿠키에 저장해 사용한다.
쉽게말해 각각 다른 정보제공을 하기 위해 서버에서 각 클라이언트에게 이름을 붙여주는것과 같다고 무방하다.
그럼 A라는 클라이언트에서 서버에게 받은 쿠키인 "초코쿠키" 라고 예시를 들어보았을때
B라는 다른 사용자가 서버에 내가 "초코쿠키"라고 거짓말을 치고 연결해 A라는 클라이언트인척 해버릴 수 있지 않을까?
그런걸 방지하기위해 세션이라는것을 사용한다.
세션
세션은 인증정보를 서버에 저장한다.
쿠키는 어디였더라? - 쿠키는 클라이언트가 서버에게 받아서 클라이언트 브라우저에 저장후 사용.
세션은 어디 ? - 서버에 저장.
세션이 뭔가요?
세션은 서버측에서 관리되는 데이터이다.
클라이언트가 서버에 접속하면 세션ID를 생성하고 이 세션ID를 쿠키안에 넣어서 보내준다.
한마디로 클라이언트가 서버에 접속하면 서버에선 클라이언트에게
쿠키, 세션ID를 생성해서 발급해준다.
여기서 둘이 다른점은 쿠키는 클라이언트의 브라우저에서 저장해서 사용.
세션ID는 서버에서 저장되서 사용.
따라서 서버에서는 클라이언트가 요청을 할때 그 클라이언트에게 발급해줬던
쿠키와 세션ID 둘을 다시한번 확인한다.
자 그럼 다시한번 정리해보자.
1. 클라이언트가 서버에 처음 접속.
2. 서버는 클라이언트에게 세션ID와 쿠키를 생성해 세션ID를 쿠키안에 담아서 발급.
3. 클라이언트는 발급받은 쿠키를 클라이언트 브라우저에 저장. 그 후 웹페이지 이용을하며 이용할때마다 서버에 요청을 할때 쿠키를 같이 전달.
4. 서버에선 쿠키를 받고 쿠키안에 들어있는 세션ID가 맞는지 확인 후 맞으면 요청에 대한 응답을 보냄.
또한 클라이언트에서 서버에 보낸 쿠키에 세션ID 말고도 사용자의 개인화, 세션유지 등등이 저장되어있는데 이 쿠키를 보고 서버에선 이 쿠키가 유지되는동안 사용자에 맞게끔 정보제공.
5. 쿠키의 수명이 만료되면 쿠키가 삭제되며 그 안에 들어있던 세션ID , 개인화된 서비스 데이터들도 함께 삭제.
6. 쿠키 만료후 재접속하면 서버에서 다시 새롭게 클라이언트에게 쿠키와 세션ID 생성후 발급
실제 예시
GET
/me
HTTP/1.1
Host: test.com
Cookie: session=ashndbkjawhebkrajhwebr;
( 키 : ashndbkjawhebkrajhwebr; 값 : admin )
쿠키 적용법
쿠키는 클라이언트의 브라우저에 저장된다고 했었다.
그럼 우리는 클라이언트의 입장인데 우리가 저장하고있는 쿠키를 조회, 수정, 추가 할 수 있는거다.
조회를 해보자. (크롬기준)
1. F12를 눌러 개발자 도구를 연다.
2. Console 탭에 들어가 document.cookie 를 작성해 자바스크립트를 사용해 쿠키를 조회해본다.
직접 써보았고 챗지피티를 이용해 주요 쿠키들을 해석해보면.
- _ga: Google Analytics에서 사용하는 쿠키로, 웹 사이트 방문자를 구별하는 데 사용됩니다. _ga=GA1.1.562800409.1688201538는 유일한 식별자로서 해당 방문자를 식별하는 역할을 합니다.
- _clck: 클릭 정보를 추적하는 데 사용되는 클릭 트래킹 쿠키입니다. _clck=38oe65|2|fcx|0|1277는 클릭 정보와 관련된 데이터를 포함하고 있습니다.
- csrf_token: CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 토큰으로 사용되는 쿠키입니다. csrf_token=cYA88EZhQLP439UdtXgK9AAi9edTuHCfMOwnRtAryf5wuXmVp7NaD8ol6v3STk3O는 해당 세션의 CSRF 토큰 값을 나타냅니다.
- roadmap_last: 사용자의 최근 로드맵 정보를 나타내는 쿠키입니다. roadmap_last=%7B%22id%22%3A1%2C%22title%22%3A%22Web%20Hacking%22%7D는 최근에 선택한 로드맵의 ID와 제목 정보를 포함하고 있습니다.
- objective_last: 사용자의 최근 목표 정보를 나타내는 쿠키입니다. objective_last=%7B%22id%22%3A4%2C%22title%22%3A%22Cookie%20%26%20Session%22%7D는 최근에 선택한 목표의 ID와 제목 정보를 포함하고 있습니다.
- _clsk: 클릭 데이터를 수집하는 Clarity 서비스에서 사용하는 쿠키입니다. _clsk=1vz6tin|1688201699891|7|1|b.clarity.ms/collect는 클릭 데이터와 관련된 정보를 포함하고 있습니다.
- _ga_GYX8VR6KG3: 또 다른 Google Analytics 쿠키로, 해당 방문자를 구별하는 데 사용됩니다. _ga_GYX8VR6KG3=GS1.1.1688201537.1.1.1688201771.60.0.0는 유일한 식별자로서 해당 방문자를 식별하는 역할을 합니다.
등 쿠키를 조회했을때 나오는것들은 웹 사이트 방문자 식별 , 사용자의 개인화를 맞추기위해 사용자의 이용정보들을 수집하는 쿠키들이 나온다.
이번엔 세션id가 들어있는 쿠키를 봐보자.
1. 먼저 네이버 로그인창을 들어가서 우클릭후 검사를 눌렀다. (크롬기준 실습)
2. Network 탭에서 Preserve log 버튼을 체크해준다.
( Preserve.log ?? - 옵션을 활성화하면 페이지 새로고침이나 탐색 변경 등으로 인해 새로운 네트워크 로그가 생성될 때 이전의 로그를 보존합니다.
기본적으로 개발자 도구의 Network 탭은 페이지를 새로고침하면 이전의 네트워크 로그가 지워지고 새로운 로그로 대체됩니다. 하지만 "Preserve log"을 활성화하면 새로운 로그가 추가되더라도 이전의 로그는 유지됩니다.
이를 통해 이전의 네트워크 요청 및 응답 정보를 계속해서 확인할 수 있습니다.
한마디로 로그를 유지하고 웹 페이지와 관련된 네트워크 요청 및 응답을 분석하거나 디버깅할 때 유용 )
3. Preserve.log 를 체크후 로그인한다.
로그인 성공 시 응답 (Response) 들을 볼수 있는데 여기에서 login 에 연관되어있는 응답들을 살펴보았고
그중 쿠키값을 설정하는 응답들을 보았다.
세션값을 설정하는 쿠키를 네이버에선 NID_AUT , NID JKL , NID_SES로 설정하는것 같은데 봐도 모르겠으니
챗지피티를 사용해서 각각 무엇을 설정하는건지 보았다.
NID_AUT, NID_JKL, NID_SES는 네이버에서 사용하는 쿠키입니다. 각각의 쿠키에는 다음과 같은 정보가 저장될 수 있습니다:
- NID_AUT: 이 쿠키는 사용자의 인증 상태를 나타내는 쿠키로, 사용자가 로그인한 상태인지 여부를 확인하는 데 사용됩니다.
- NID_JKL: 이 쿠키는 사용자의 개인화 설정과 관련된 정보를 저장하는 쿠키입니다. 예를 들어, 사용자의 언어 설정, 지역 설정, 테마 등의 개인화된 환경 설정이 이 쿠키에 저장될 수 있습니다.
- NID_SES: 이 쿠키는 사용자의 세션 정보를 저장하는 쿠키입니다. 세션 ID와 관련된 정보가 포함되어 있어, 사용자의 세션을 유지하고 식별하는 데 사용됩니다.
즉 네이버는 세션정보를 저장하는 쿠키를 NID_SES로 사용하는 중인거를 확인했다.
따라서 여기에 세션ID가 암호화 되어 포함되어 있는것.
배우고 나서 내 생각을 정리
위에 내용들은 지피티의 도움받아 작성했던 부분들 말고는 직접 드림핵을 보면서 내가 이해한대로 작성했다.
먼저 쿠키라는것들에 대해 많이 들어는보았으나 여태 뭔지 정확히 몰랐지만 이번기회에 알았고
실습을 하면서 제공되었던 드림핵 사이트에선 로그인하고 나서 받은쿠키는 세션id가 새로고침할때마다 바뀌지않았다.
로그아웃을 하고도 똑같은 세션id를 관리자 도구에 application 탭에 쿠키칸에 똑같이 값을 붙여넣으니 그대로 로그인이 되는것을 확인했고 쿠키가 만료되지않고 유지되어있을때 세션id를 사용하면 그대로 로그인이 된다는것을 알았다.
그래서 네이버에서도 똑같이 도전해보았고 NID_SES칸에 세션정보를 저장하는것을 알았으나
새로고침할때마다 NID_SES와 NID_JKL이 바로바로 바뀌는것을 보았다.
따라서 세션정보를 가로채봤자 다른곳에서는 네이버에 이 세션정보로 로그인하는것이 불가능하다는것을 알았고 실무에선 이런식으로 적용이 되고있구나 라는것을 배웠다.
'드림핵 정리' 카테고리의 다른 글
Same Origin Policy (SOP) (1) | 2024.06.14 |
---|---|
무작위 비밀번호 생성 코드 (1) | 2023.11.04 |
드림 핵 - 웹 해킹 - 웹 브라우저 ( Tools : Browser DevTools ) (0) | 2023.06.27 |
드림 핵 - 웹 해킹 - 웹 브라우저 ( Background : Web Browser ) (0) | 2023.06.27 |
드림 핵 - 웹 해킹 - 웹 기본 상식 ( Background: HTTP/HTTPS ) (0) | 2023.06.26 |