CSRF가 뭐예요?
CSRF(Cross-Site Request Forgery)와 그 사촌 클릭재킹을, 손님이 찬 입장 팔찌를 빌려 손님 몰래 창구에 쪽지를 보내는 도둑 이야기로 풀어봤어요.
창구는 손님 팔찌만 보고 쪽지를 들어줘요.입장 팔찌를 찬 손님이 쪽지를 내면 창구는 팔찌만 보고 금화를 보내요. 편해요. 그런데 마을 게시판에 도둑이 이상한 종이를 붙여 뒀어요.
CSRF는 손님 팔찌를 빌려 몰래 보내는 쪽지예요.손님은 빵 그림만 봤어요. 그런데 그 종이가 손님 팔찌를 달아 '내 금화를 도둑에게' 쪽지를 창구로 보내요. 팔찌는 진짜라서 창구는 믿어요 — 뜻만 가짜예요.
사촌도 있어요: 투명 종이 밑에 진짜 버튼을 숨겨요.도둑이 우리 창구 위에 투명 종이를 덮고 '여기 눌러요!'라고 써요. 손님이 누르면 밑에 있던 진짜 '금화 보내기' 버튼이 눌려요. 팔찌도 진짜, 손가락도 진짜예요.
쪽지엔 번호표, 팔찌는 우리 창구만, 창문은 우리 것만.창구가 그 자리에서 준 번호표 없는 쪽지는 안 받아요 — 게시판 종이는 번호를 몰라요. 팔찌는 우리 창구에 낸 쪽지에만 붙고, 우리 창구는 남의 창문 안에 나오지 않아요.
쪽지 속을 노리는 도둑과 팔찌를 노리는 도둑은 달라요.쪽지에 숨긴 명령은 도둑이 자기 손으로 보내고, 이 도둑은 손님 손으로 보내게 해요. 둘 다 창구 앞 쪽지 검토원이 먼저 보지만, 팔찌 도둑은 번호표가 있어야 막혀요.
CSRF = 도둑이 붙인 종이가 손님 팔찌를 빌려 손님 몰래 창구에 가짜 뜻의 쪽지를 보내는 것. 번호표(그 자리에서 준 비밀 번호), 팔찌는 우리 창구만, 남의 창문엔 안 나오기로 막아요.
Cross-Site Request Forgery. 로그인된 사용자의 브라우저가 쿠키를 자동으로 붙이는 걸 이용해, 다른 사이트에서 사용자 몰래 요청을 보내게 하는 공격이에요. CSRF 토큰, SameSite 쿠키, 그리고 클릭재킹을 막는 X-Frame-Options / CSP frame-ancestors 로 막아요.
어른들은 이렇게 불러요
- CSRF
CSRF - 팔찌 빌려 몰래 보내는 쪽지. 손님은 진짜, 팔찌도 진짜, 뜻만 가짜. 손님이 로그인한 채로 도둑의 페이지를 열면 생겨요.
- CSRF 토큰
CSRF token - 그 자리에서 준 번호표. 창구가 쪽지 종이에 미리 적어 준 비밀 번호. 게시판 종이는 이 번호를 알 수 없어요.
- SameSite 쿠키
SameSite cookie - 우리 창구에서만 통하는 팔찌. 다른 마을에서 보낸 쪽지엔 팔찌가 안 붙어요. 요즘 브라우저는 기본으로 이렇게 해요.
- 클릭재킹
Clickjacking - 투명 종이 밑의 진짜 버튼. 손님이 '여기 눌러요'를 누르면 밑의 진짜 버튼이 눌려요. 팔찌 빌리기의 사촌이에요.
- X-Frame-Options / CSP
X-Frame-Options / CSP - 남의 창문엔 안 나오기. 우리 창구를 다른 페이지 안에 끼워 넣을 수 없게 해요. 그러면 투명 종이를 덮을 곳이 없어요.
- 세션
Session - 입장 팔찌. 창구가 손님을 알아보는 팔찌. 훔칠 수도, 빌릴 수도 있어요. → 입장 팔찌를 훔치는 도둑
- 인젝션과의 차이
Versus injection - 쪽지 속 vs 팔찌. 인젝션은 쪽지 안에 명령을 숨기고, CSRF는 남의 팔찌로 보내요. → 쪽지에 숨긴 명령
- WAF
WAF - 창구 앞 쪽지 검토원. 이상한 쪽지를 먼저 걸러요. 하지만 팔찌 도둑은 번호표가 있어야 확실히 막혀요. → 창구 앞 쪽지 검토원