729. CSRF 방어용 Synchronizer Token Pattern 및 SameSite 쿠키 제어
핵심 인사이트: 앞서 배운 CSRF 사기극의 원인은, 서버가 "쿠키(로그인) 도장만 묻어있으면 무조건 통과!"시켜줬기 때문이다. 이를 막는 가장 기발한 방법은? 진짜 은행 화면에 폼(Form)을 띄워줄 때 눈에 안 보이는 '1회용 비밀 암호(Token)'를 하나 껴서 주는 것이다. 해커는 내 쿠키는 자동으로 이용할 수 있어도, 은행이 내 화면에만 뿌려준 이 1회용 암호의 정체는 절대 알지 못한다. 이것이 완벽한 CSRF 방어막 토큰의 비밀이다.
Ⅰ. 방어의 한계 (왜 단순 필터링으로 안 되나?)
- 해커의 요청이 정상적인 나의 IP와 나의 정상적인 쿠키를 달고 날아오기 때문에, 서버의 방화벽이나 입력값 필터링만으로는 이게 해커의 짓인지 구분할 수가 없습니다.
Ⅱ. 방어 기술 1: Synchronizer Token Pattern (CSRF Token) 🌟
가장 확실하고 전 세계 웹 프레임워크(Spring, Django, Laravel)에서 기본적으로 강제 탑재해 놓은 표준 방어 기술입니다.
1. 동작 원리 (숨겨진 난수 맞추기)
- 앨리스가 A 은행의
[송금 화면]에 정상적으로 찰칵 접속합니다. - 은행 서버는 앨리스에게 화면을 뿌려줄 때, 화면 속 HTML 폼(Form) 깊숙한 곳에 눈에 안 보이는 입력칸(Hidden)으로
CSRF_TOKEN: x9f@8zk라는 일회용 무작위 난수를 쏙 끼워 넣어 줍니다. (서버도 이 난수를 기억해 둡니다.) - 앨리스가 송금 버튼을 누르면, 쿠키와 함께 이
x9f@8zk토큰이 같이 은행 서버로 날아가고, 은행은 "음, 아까 내가 준 토큰표 가져왔네. 정상 처리!" 통과시킵니다.
2. 해커의 절망
- 해커의 '고양이 낚시 사이트'에서 앨리스가 클릭하면, 앨리스의 브라우저가 은행 쿠키는 자동으로 붙여서 쏩니다.
- 하지만! 해커는 은행이 방금 앨리스의 진짜 화면 안에 몰래 뿌려준 일회용 토큰
x9f@8zk가 무엇인지 절대 알 방법이 없습니다 (동일 출처 정책, SOP 탓에 해커가 남의 화면을 훔쳐볼 수 없음). - 결국 해커가 억지로 날린 송금 요청 패킷 안에는 CSRF 토큰표가 텅 비어있거나 가짜 값이 들어있게 됩니다. 서버는 "쿠키는 맞는데, 토큰표가 없잖아! 너 해커 낚시 사이트에서 왔지!"라며 즉시 걷어차 버립니다. (방어 100% 성공)
Ⅲ. 방어 기술 2: SameSite 쿠키 제어 속성 🌟
서버 개발자가 일일이 토큰을 만들기 귀찮을 때, 최신 웹 브라우저(크롬 등)가 아예 자체적으로 지원하기 시작한 가장 강력하고 우아한 방어막입니다.
1. 브라우저의 똑똑한 반란
- 기존의 바보 브라우저: 내가 '고양이.com(A 사이트)'에서 버튼을 눌러도, 요청 목적지가 '은행.com(B 사이트)'이면 무조건 은행 쿠키를 친절하게 다 붙여서 날려줬습니다(Third-party 쿠키 허용).
SameSite속성의 등장: 서버가 로그인 쿠키를 구워줄 때SameSite=Lax나SameSite=Strict라는 꼬리표를 하나 딱 달아줍니다.- 이 꼬리표를 본 브라우저는 선언합니다. "앞으로는 내가 현재 보고 있는 주소창의 사이트 이름(A)과, 데이터가 날아갈 목적지 사이트 이름(B)이 다르면(크로스 사이트), 보안을 위해 아예 이 쿠키를 꺼내서 붙여주지 않겠다!"
2. 해커의 멸망
- 이제 앨리스가 '고양이 사이트'에서 낚시 버튼을 아무리 클릭해 봐야, 앨리스의 크롬 브라우저가 "목적지는 은행인데 넌 왜 고양이 사이트에서 누르냐? 쿠키 안 줄래!" 하고 쿠키를 떼버리고 그냥 알맹이 없는 빈 껍데기 요청만 은행으로 쏩니다. 은행은 당연히 로그인이 안 된 비회원 쓰레기 요청으로 간주하고 폐기합니다.
Ⅳ. 방어 기술 3: Referer 검증 (가성비 최고)
- 토큰을 만들기 귀찮을 때 서버가 쓰는 단순한 꼼수입니다. 모든 HTTP 요청 헤더에는
Referer(이 요청을 쏜 직전 사이트 주소)가 적혀 날아옵니다. - 은행 서버는 딱 한 줄만 짭니다. "내게 온 송금 요청의
Referer주소가http://A은행.com으로 시작하지 않으면 모조리 버려라!" 해커의 고양이 사이트에서 온 요청은Referer가 고양이 주소이므로 가차 없이 차단됩니다.
📢 섹션 요약 비유: CSRF 사기를 막는 두 가지 철벽. 'CSRF 토큰'은 은행이 진짜 창구에 온 손님에게만 1분 뒤에 폭발하는 '비밀 일회용 도장'을 쥐여주고, 송금 서류에 인감도장(쿠키)과 이 비밀 도장(토큰) 두 개가 동시에 찍혀야만 돈을 주는 시스템입니다. 해커가 멀리서 강제로 사장님 팔을 조종해 인감을 찍게 만들어도 비밀 도장이 없어 사기가 불가능합니다. 'SameSite 쿠키'는 아예 내 지갑(브라우저) 자체가 똑똑해져서, "내가 지금 진짜 은행 건물 안에 들어가 있는 게 아니라면, 절대 주머니에서 내 인감도장(쿠키)을 꺼내주지 않겠다!"라고 철벽을 치는 인공지능 보안 지갑 기술입니다.