HTTP는 비 연결성 특징을 가지고 있기 때문에 통신하는 서로가 요청/응답이 끝나면 통신을 종료하게 된다. 쉽게 말하면, 로그인을 하고 페이지를 이동할 때마다 로그인을 해야 하는 불상사가 발생할 수 있다. 이러한 단점은 쿠키와 세션을 사용해서 보완할 수 있다.

 

쿠키와 세션의 역할은 비슷하지만 크나큰 차이는 저장되는 위치이다. 쿠키는 어떤 웹사이트를 방문했을 때 텍스트 형태로 클라이언트에 저장되며, 클라이언트의 상태 정보를 담은 임시파일이다. 이후 똑같은 웹사이트를 다시 방문했을 시 저장되어 있는 쿠키값과 함께 서버에 자원을 요청하게 된다. 그래서 자동 로그인, 광고 하루 안 보기, 장바구니 담기 등 같은 기능에 사용된다. 좀 더 이해하기 쉽게 홈페이지를 만들어 쿠키를 생성해보았다.

 

간소하지만 광고 팝업창이라 치자. 여기서 내가 작성한 소스코드는 홈페이지에 접속하면 쿠키값을 검사해 없으면 팝업창을 띄우게 된다. 팝업창에서 '오늘 하루 그만 보기'를 누르면 쿠키가 생성되면서 홈페이지에 다시 접속해도 쿠키가 만료될 때까지 팝업창이 안 뜨게 한다.

 

쿠키 확인은 브라우저마다 다른데 크롬 브라우저 기준으로 사이트 주소 왼쪽에 느낌표를 누르면 확인 가능하다. 쿠키 이름, 경로, 만료 날짜 등 해당 쿠키에 관한 정보를 확인할 수 있다. 하지만 쿠키는 클라이언트, 즉 사용자의 하드디스크에 저장하다 보니 쿠키에 대한 변조 및 유출 우려가 있고 웹브라우저를 변경하면 저장되어있는 쿠키는 사용 불가하다. 그래서 나온 게 세션이다.

 

세션은 쿠키와 반대로 서버에 저장되다 보니 변조 및 유출에 대한 우려가 없고, 클라이언트의 웹브라우저 종류에 상관없이 사용 가능하다. 하지만 양이 많아질수록 서버에 대한 부하가 커진다는 단점이 있다. 세션은 식별할 수 있는 세션 ID를 사용하는데 세션 ID를 쿠키로 저장한다. 결국 세션도 쿠키를 사용하지만 민감한 정보를 저장하진 않는다. 그런데 쿠키값에 있는 세션 ID가 스니핑으로 인해 유출당했을 경우 보안상 문제가 생긴다.

 

닉네임 '세션하이재킹' 으로 로그인되어 있고, PHP의 세션 ID는 PHPSESSID에 저장되니 눌러보면 확인 가능하다. 만약 저 값이 XSS나 스니핑 등의 취약점으로 유출되었을 시 공격자는 세션 ID로 로그인을 할 수 있다.

 

위 사진을 보면 공격자가 발급받은 쿠키값이 보인다. 하지만 여기다가 피해자의 쿠키값을 대입하면 피해자 아이디로 로그인이 될 것이다. 이를 세션 하이재킹이라 한다.

 

공격 성공 화면

그러면 세션도 쿠키도 둘다 안전하지 않으면 뭘 쓰느냐고 의아해할 수 있는데, 이는 웹 취약점 또는 네트워크 보안 문제에서 발생한 것이기 때문에 웹 시큐어코딩이나 HTTPS 프로토콜을 사용한 암호화 방법, 네트워크 보안 구축 등 으로 예방할 수 있다.

'공부 > ' 카테고리의 다른 글

XSS와 CSRF  (0) 2020.06.10

+ Recent posts