CSRF란 Cross Site Request Forgery로, 사이트 간 위조요청을 뜻한다.
유저가 자신의 의지와는 무관하게 공격자가 의도한 요청을 보낸다는 것이 특징이다.
이 '공격자가 의도한 요청'은 개인정보의 탈취, 개인정보 변경, 게시글 수정 등이 해당할 수 있다.
어떻게 전개되는가?
- 사용자가 세션 또는 쿠키 로그인을 지원하는 웹사이트에 접속해 로그인한다.
- 로그인 후 세션, 쿠키가 브라우저에 저장된다.
이게 전제조건이다.
이후
- 공격자가 만든 사용자가 이전에 접속한 웹사이트와 비슷한 위조사이트에 사용자가 방문하게된다.
- 사용자는 위조여부를 구분하지 못하고 일반적으로 요청을 보내게되는데, 이 때 브라우저에 저장된 세션쿠키가 같이 자동으로 웹사이트에 요청으로 보내져 기존에 사용자가 사용하던 웹사이트로 요청을 보낸다.
- 요청을 받은 웹사이트는 정상적인 사용자로 요청을 인식하고 처리한다.
내가 티스토리에서 카카오톡 계정에 로그인한 후 글을 쓰고, 내 정보가 세션에 저장되었다고한다. 그 후 우연히 CSRF 공격자의 웹사이트를 방문하여 여러 요청을 보냈는데, 그 요청에 카카오톡 로그인 및 내 계정을 삭제하는 코드가 담겨있다면 브라우저에 저장된 세션쿠키에 따라 이 요청은 인증된 상태로 처리되고 내가 탈퇴되는 것이다.
이처럼 CSRF 공격의 가장 큰 특징은
사용자의 정보를 가져오거나 빼앗는 것이 아니라 공격자가 마치 사용자인 것처럼 행동한다는 것이다. 그 행동이 간단한 것일수도있지만 계좌송금, 비밀번호 삭제 등의 위험한 행위일 수도 있다는 것이 큰 특징이다.
<img src="http://websiteForCSRF.com/logout">
예를들어 HTML의 img 태그에 있는 URL 주소는 GET 요청이 보내지게되는데,
만약 CSRF 공격자의 웹사이트에 저 코드가 심어져있다면 이미지를 누르는 것만으로도 특정 사이트에서 로그아웃 되는 일이 벌어지게되는 것이다.
방어하기
CSRF 공격을 막는 것의 가장 큰 특징은 '헤더를 직접 설정할 수 없다'이다. 위의 방식들은 모두 브라우저가 알아서 붙여주는 헤더를 이용하여 공격을 보낸 것이기에 이를 활용하면 CSRF 공격을 방지할 수 있다. 대부분의 브라우저들은 SOP를 지원하는데, SOP 환경에서는 절대 프론트엔드에서 따로 설정한 도메인에서 온 요청을 제외하고는 모두 요청이 거절된다.
그래서 공격자가 직접 헤더를 설정하거나 요청을 만져서 요청을 보낼 수는 없다. 왜냐하면 유저의 브라우저와 유저의 세션을 이용하여 행위를 조작하는 것이 CSRF 공격인데, 그러면 공격자가 특정 행위가 일어나길 기대하는 웹사이트에서는 유저의 응답만 받을 수 있다. 여기에 공격자가 일부 헤더를 추가하면 브라우저 보안정책 때문에 요청이 보내지지 않고 값을 조작하지 않은 요청만 보내질 수 있다.
스프링 시큐리티에서는 CSRF 공격을 방지하기 위해 CSRF 토큰을 발급한다.
서버에서 사용자의 요청이 들어오면 세션쿠키를 만듦과 동시에 CSRF 토큰을 하나 발급한다. 주로 안전한 난수가 활용된다.
그 뒤에 다음 요청을 보낼 때 클라이언트는 CSRF 토큰을 헤더에 담아서 보내게되고, 이 헤더를 공격자는 조작할 수 없으므로 서버는 안전하게 요청으로 들어온 헤더와 저장된 헤더를 대조하여 인증인가를 진행하게된다.
아니면 그냥 인증인가를 토큰으로 진행하는 JWT토큰을 사용해도 좋다. 탈취당하지만 않는다면
'CS > 백엔드' 카테고리의 다른 글
| [백엔드] OAuth는 어떻게 진행되는가? (0) | 2026.02.06 |
|---|---|
| [BckEnd] 스프링없이 순수JDK로 간단한 개발해보기 (0) | 2026.01.04 |
| AI를 이용할 때 할루시네이션 막아보기 (0) | 2025.11.21 |
| [CS] OPEN AI API로 간단한 메시지 보내고 받아보기 (0) | 2025.11.19 |
| WebSocketConfig로 사전 세팅하기 (0) | 2025.11.04 |