Session, Cookie, CSRF
Session, Cookie
Session
서버가 사용자 상태를 저장하는 방법. 주로 웹사이트에서 로그인 정보를 유지하는 용도로 사용한다. 무신사 같은 쇼핑몰 사이트에서 로그인 하지 않은 상태로도 장바구니에 상품을 담을 수 있는데 이때 사용하는 것도 세션이다. 세션은 다양한 기술을 통해서 구현. 적절한 기술을 사용한다. 스프링이나 장고같은 웹프레임워크에 따라서 알아서 구현해주는 부분이 많다.
세션 형성 과정
- 클라 → 서버 요청
- 서버는 요청이 첫요청인지 확인
- 세션에서 클라이언트가 보낸 세션 id 가 정보에 존재하는지 확인
- 보내지 않았다면 최초 요청으로 판단
- 보냈으나 데이터가 없다면 만료된 것으로 판단하고 최초 사용자로 처리
- 최초 사용자라면 세션에 저장공간 추가
- 클라이언트에게 세션 id 발급
Cookie
서버에 저장된 세션에 해당하는 키가 클라이언트에 저장되는곳. 서버는 클라이언트가 쿠키를 저장할 수 있도록 HTTP 헤더에 쿠키 정보를 담아 전달한다. 이후 브라우저는 요청을 보낼 때마다 쿠키를 함께 전달한다. 서버는 쿠키 정보에서 전달된 세션 id 값을 보고 특정 사용자에 맞춘 요청을 처리한다.
브라우저 개발자모드를 on 하면 주고받는 쿠키 정보를 확인할 수 있다. 스택오버플로우에 진입할 때마다 내 브라우저에 저장된 쿠키 정보가 같이 전송된다. Name이랑 Value 는 이해할 수 없는 값이다
CSRF
악의적인 자바스크립트 코드를 끼워넣어서 인증된 사용자가 의도하지 않은 요청을 수행하는 방식. 주로 스팸 메일 같은 곳에다가 버튼을 넣어 브라우저에 사용중인 쿠키 정보를 이용해 악의적인 요청을 보낸다
CSRF 가 발생하기 위한 조건
- 사용자는 서버로부터 인증받고 session id를 발급 받은 상태여야함
- 서버는 쿠키 기반으로 서버 세션 정보를 획득할 수 있어야함
조건이 갖춰지면 공격자는 사용자가 의도하지 않은 요청을 보내도록한다. 아래 예제 코드처럼 스팸메일 안의 버튼에 모든 상품을 구입하라는 요청을 심어둔다. 스팸메일을 받은 유저가 쇼핑몰에 로그인된 상태였다면 버튼을 클릭하면 해당 사이트의 모든 물건을 구입하는 액션이 자동으로 수행된다
<html>
<body>
<script>
// 사용자가 악의적인 사이트에 접속했을 때, 자동으로 요청을 보냅니다.
var form = document.createElement('form');
form.method = 'POST';
form.action = 'https://vulnerable-website.com/buy-all'; // 피해를 입힐 취약한 웹 사이트 URL
form.innerHTML = '<input type="hidden" name="엔터 누르면 100만원드림" value="1000">'; // 악성 요청 데이터
document.body.appendChild(form);
form.submit();
</script>
</body>
</html>
CSRF 방어법
Referrer 검증
서버측에서 요청을 보낸 domain 이 유요한 주소인지 확인하는 방법. 쇼핑몰 요청을 https://vunerable-website.com 에서만 받기로 했다면 그외의 다른 호스트 요청에 대해서는 위험한 요청으로 판단하고 무시한다. 그러나 이 방법은 다른 프로그램으로 조작이 가능해서 추천하지는 않는다고 한다.
CSRF token 검증
임의의 CSRF 토큰을 만들어서 세션에 저장하고, 클라이언트에서 요청을 보낼 때 CSRF Token 정보를 같이 보내도록해서 값이 일치하는지 확인한다. 스팸 메일로 보내는 경우 CSRF 토큰에 대한 정보가 없으므로 서버에서는 위조된 요청으로 판별하고 요청을 거부한다.
<form action="/example" method="post">
<input type="hidden" name="csrf_token" value="토큰 값">
<!-- 폼 요소들 -->
<button type="submit">제출</button>
</form>