728. CSRF (Cross-Site Request Forgery) 인증 세션 권한 도용
핵심 인사이트: 앨리스가 네이버 로그인 상태를 유지한 채, 해커가 보낸 "귀여운 고양이 사진 링크"를 무심코 클릭했다. 그 순간, 화면엔 고양이가 뜨는데, 보이지 않는 백그라운드에서는 앨리스의 아이디로 "비밀번호를 해커의 번호로 변경하라!"라는 요청이 네이버 서버로 쓱 날아간다. 서버는 앨리스의 쿠키(인증서)가 묻어있으니 의심 없이 처리해 버린다. 내가 원치 않은 클릭(요청)을 내 신분으로 강제로 실행하게 만드는 사기꾼 조종술, 그것이 CSRF다.
Ⅰ. CSRF (크로스 사이트 요청 위조)의 개념
- 개념: 사용자가 자신의 의지와는 무관하게, 해커가 의도한 행위(게시글 작성, 비밀번호 변경, 계좌 송금 등)를 특정 웹사이트에 '요청(Request)'하도록 강제당하는 웹 해킹 기법입니다.
- XSS와의 결정적 차이 🌟:
- XSS (726번): 해커가 내 브라우저에 악성 스크립트를 돌려서 내 '쿠키(지갑)'를 훔쳐다 자기 주머니로 가져가는 도둑질입니다.
- CSRF: 해커는 내 쿠키를 훔치지(보지) 못합니다. 단지 로그인되어 있는 내 '손(권한)'을 꼭두각시처럼 강제로 조종해서, 내 신분으로 나도 모르게 은행에 악성 송금 버튼을 누르게(위조 요청) 만드는 꼭두각시 조종술입니다.
Ⅱ. CSRF 공격이 성공하기 위한 필수 조건 🌟
이 마법 같은 조종술이 성공하려면 3가지 톱니바퀴가 딱 맞물려야 합니다.
- 타겟 사이트의 허술함: 공격당할 사이트(예: 피해 은행)가 사용자의 요청(송금)이 진짜 사용자가 누른 버튼인지, 엉뚱한 사이트에서 날아온 억지 클릭인지 검사하는 2차 검증 로직이 없어야 합니다.
- 피해자의 로그인 유지 상태: 희생자의 브라우저에는 이미 은행 사이트의 '정상적인 세션 쿠키(로그인 통행증)'가 살아 숨 쉬고 있어야 합니다.
- 피해자의 무의식적 클릭 (Trigger): 해커가 카톡이나 이메일로 보낸 낚시 링크를, 희생자가 로그인된 브라우저에서 무심코 찰칵 클릭해야 합니다.
Ⅲ. 공격 시나리오 메커니즘 (어떻게 속이는가?)
- 앨리스는 방금 A 은행에서 잔액 조회를 마치고, 창은 닫았지만 로그아웃은 누르지 않아 브라우저에 인증 쿠키가 빵빵하게 살아있습니다.
- 해커 다스가 앨리스에게 카톡으로
http://다스해킹.com/고양이.html링크를 보냅니다. - 앨리스가 링크를 클릭해 고양이 사이트를 여는 순간, 그 사이트 안에 투명하게 숨겨진 이미지 태그
<img src="http://A은행.com/send_money?to=다스계좌&amount=100만">코드가 앨리스의 브라우저에서 몰래 실행됩니다. - 브라우저의 바보 같은 성질: 웹 브라우저는 코드를 읽자마자 A 은행에 송금 요청 패킷을 던집니다. 이때, 브라우저는 아까 저장해 둔 "A 은행의 살아있는 쿠키(로그인 인증서)"를 너무나도 친절하게 찰싹 붙여서 같이 쏴버립니다.
- A 은행 서버는 요청을 받습니다. "어? 송금 요청에 앨리스 쿠키가 딱 붙어있네? 앨리스 본인이 요청한 거 확실하구만! 다스 계좌로 100만 원 쏴!" (게임 오버)
Ⅳ. 왜 막기 힘든가?
- 서버 입장에서는 이 송금 요청이 앨리스가 진짜 은행 화면에서 직접 누른 건지, 아니면 해커의 고양이 사이트에서 숨겨진 이미지 태그 때문에 억지로 날아온 건지 구별할 물리적 방법이 없습니다. IP 주소도 앨리스 것이고, 쿠키도 앨리스 진짜 쿠키이기 때문입니다.
📢 섹션 요약 비유: CSRF는 도장(쿠키)을 훔쳐 가지 않고, 사장님(희생자)의 손을 강제로 붙잡아 결재 서류에 억지로 도장을 찍게 만드는 사기극입니다. 해커는 결재판(악성 요청)을 "귀여운 고양이 달력"인 것처럼 사장님 책상 위에 올려둡니다(낚시 링크). 사장님이 아무 생각 없이 달력을 꾹 누르는 순간, 그 밑에 먹지가 깔려있어 사장님의 팔꿈치에 묻어있던 인감도장(로그인 쿠키)이 아래에 몰래 깔아둔 '10억 송금 결재 서류'에 쾅 찍혀 은행으로 날아가 버립니다. 은행은 도장이 진짜 사장님 것이라 무조건 돈을 내어주는 완벽한 서류 위조 사기입니다.