Hacking_study/해킹과제

쿠키 / 세션 / 세션id

jin_li 2023. 4. 8. 00:05

내가 만든 쿠키~🍪

 
기본적으로 웹 서버는 클라이언트를 기억할 수 없습니다.
HTTP 프로토콜의 Connectionless Stateless 특징 때문입니다.

Connectionless: 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미합니다. 특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새 요청이 있을 때 마다 항상 새로운 연결을 맺게 됩니다.

Stateless: 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미합니다. 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없습니다.

 

 

따라서 웹 서버가 클라이언트 측을 기억하게 하기 위해 쿠키(Cookie)를 이용합니다.
 
쿠키(cookie): 클라이언트 측에서 웹 사이트를 방문할 때, 서버에서 전송하는 작은 데이터 조각입니다.
클라이언트는 쿠키를 저장하고, 이후에 동일한 웹 사이트를 방문할 때 쿠키를 다시 서버로 보냅니다. 이를 통해 웹 서버는 클라이언트를 구별하고, 사용자에게 맞춤화된 서비스를 제공할 수 있습니다.
 
 

 

간단한 예를 들면 다음과 같습니다.

쿠키가 없는 통신
: 제가 장바구니에 넣어둔 코코볼과 화장솜.. 쇼핑몰 들어갈 때마다 계속 장바구니에서 사라집니다. :(
쇼핑몰 서버가 저를 기억하지 못하니 제가 장바구니에 담은 물건들도 보여줄 수 없는 거예요.
 
쿠키가 있는 통신
: 쇼핑몰 웹을 껐다 켜도 장바구니에 넣어둔 코코볼과 화장솜은 그대로 있습니다. 편하죠 :)
장바구니를 보여달라는 제 요청에 쇼핑몰 서버가 보내준 쿠키가 포함되면, 이 쿠키를 통해 쇼핑몰 서버가 저를 알아보고 제 장바구니를 보여줍니다.

 

 

 

쿠키 설정하는 법

: 쿠키는 클라이언트에 저장되기 때문에 클라이언트 측과 서버 둘 다 설정할 수 있습니다.

 

 

 

서버에서 설정할 때HTTP 응답 중 헤더에 쿠키 설정 헤더(Set-Cookie)를 추가하면 클라이언트의 브라우저가 쿠키를 설정합니다.

php로 쿠키 및 세션을 설정하고 관리하는 법은 이 게시글에서!(아직 공부 중.. 정리 다 되면 공개할 예정)

 

 

클라이언트 측에서 설정할 때는 자바스크립트를 사용합니다. 

콘솔에서 document.cookie 를 이용해서, 이름=값 쌍으로 만듭니다. Expires 속성으로 쿠키 만료 날짜 및 시간 설정도 가능합니다.

php로 자동으로 생성된 세션id도 쿠키에 저장되어 있습니다.

 

어플리케이션에서 쿠키 탭에서 확인할 수 있습니다.

여기서도 쿠키 설정할 수 있습니다.


 
 
 
 

세션(session)

 
쿠키는 클라이언트 측에서 서버로 전송되는 정보이므로, 악의적인 클라이언트는 이 쿠키를 변조해서 서버에 요청할 수 있습니다. 이를 쿠키 변조라고 합니다.
 
세션쿠키에 인증 "상태"를 저장하지만 악의적인 클라이언트가 인증 "정보"를 변조할 수 없게 하기 위해 사용합니다.
 
세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키를 만들어 클라이언트에 전달하는 방식으로 작동합니다. 해당 키를 일반적으로 Session ID라고 하며, 유추할 수 없는 랜덤한 문자열로 이루어집니다. 브라우저는 이 Session ID쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용합니다. 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인합니다.
 


 
다음은 세션의 예시입니다.
 중국집 식당의 탕수육 이벤트 쿠폰 도장을 조작하는 손님이 생겼습니다. 손님이 갖고 있는 쿠폰은 손님이 조작할 수 있기 때문에 쿠폰에 도장을 찍지 않고 손님마다 랜덤한 문자열을 적은 쿠폰을 주었습니다. 손님이 쿠폰을 식당에 제시하면 식당에 보관중인 메모장에서 쿠폰에 적힌 문자열과 방문 횟수를 기록하는 방식으로 이벤트를 운영했습니다. 이 때문에 손님은 쿠폰에 적힌 랜덤한 문자열은 조작할 수 있지만 매장에 기록된 방문 횟수는 조작할 수 없게 되었습니다.
 
 

 

세션 하이재킹(Session Hijacking)은 공격자가 합법적인 사용자의 세션 ID를 탈취하여 해당 사용자의 세션을 제어하는 공격입니다. 이를 통해 공격자는 세션을 제어할 수 있으므로 해당 사용자의 권한을 가지고 행동하거나, 사용자의 데이터에 접근할 수 있습니다.
 
세션 하이재킹과 쿠키 변조는 모두 인증 우회 공격의 일종이지만, 쿠키 변조는 쿠키의 값을 조작하여 공격을 수행하는 반면, 세션 하이재킹은 세션 ID를 탈취하여 공격을 수행합니다. 따라서 쿠키 변조는 클라이언트 측에서 수행되는 반면, 세션 하이재킹은 서버 측에서 처리되는 공격입니다.
 
세션 하이재킹을 막기 위해서는, 세션 ID를 안전하게 전달하고 저장하는 것이 중요합니다. HTTPS 프로토콜을 사용하여 통신하는 것이 좋으며, 세션 ID를 쿠키에 저장할 때 HttpOnly 속성을 사용하여 XSS 공격으로부터 보호하는 것이 좋습니다. 또한, 세션 ID의 유효시간을 가능한 짧게 설정하여 공격자가 탈취한 세션 ID가 유효하지 않게 만드는 것도 중요합니다.
 
 
 
 
 

정리

쿠키와 세션의 둘 다 클라이언트의 요청에 대한 상태를 유지하기 위해 사용됩니다.
차이점은 쿠키는 클라이언트 브라우저에 저장되는 반면, 세션은 서버 측에서 데이터를 관리하고 클라이언트는 세션 ID만 가집니다. 또한 보안 측면에서 세션이 쿠키보다 더 안전한 방식으로 데이터를 유지하고 전달할 수 있어요.

 

 


 
참고 : 드림핵