본문으로 건너뛰기

사이트 간 요청 위조(Cross-site Request Forgery, CSRF) 공격

사이트 간 요청 위조(Cross-site Request Forgery, CSRF) 공격은 사용자가 자신의 의지와 상관없이 공격자가 의도한 행위를 특정 웹사이트에 요청하도록 하는 것을 의미합니다.

예를 들어, 특정 사용자가 서비스에서 로그인을 수행하고 서버는 해당 사용자에 대한 세션 ID를 Set-Cookie 헤더에 담아서 응답합니다. 그리고, 클라이언트는 쿠키를 저장하고 요청마다 자동으로 전달합니다.

이러한 사용자를 대상으로 공격자는 악성 스크립트가 담긴 페이지에 접속하도록 유도합니다. 유도하는 방법은 다양한데요. 악성 스크립트가 포함된 메일이나 게시글을 작성하거나, 악성 스크립트가 포함된 공격자 사이트 접속 링크를 전달하는 것이 대표적입니다.

사용자가 악성 스크립트가 포함된 페이지에 접속하게 되면 악성 스크립트가 실행됩니다. 이 스크립트는 사용자의 의도와 상관없는 특정한 요청(결제, 비밀번호 변경)을 공격 대상 서버로 보내도록 구현되어 있습니다. 해당 요청은 브라우저에 의해서 자동으로 쿠키에 저장된 세션 ID가 함께 전달됩니다.

예를 들어, 공격자가 만든 사이트 내부에는 다음과 같은 태그가 존재할 수 있습니다.

<img src ="https://johnycho.com/member/changePassword?newValue=1234" />

공격자 사이트에 방문한 사용자는 자신의 의지와 무관하게 img 태그로 인해 세션 ID가 포함된 쿠키와 함께 비밀번호 변경 요청을 서버로 전달합니다.

✔️ CSRF 공격은 어떻게 방어할 수 있을까?

교차 출처인 상황에서의 요청을 막는 방식으로 CSRF를 방어할 수 있습니다.

1) Referer 요청 헤더 사용

Referer는 브라우저가 현재 요청에 대한 웹 페이지의 주소(출처)를 서버에 알려주는 HTTP 요청 헤더입니다. 해당 주소와 Host(서버의 도메인 이름) 헤더를 비교하여 다른 경우, 예외를 발생시킬 수 있습니다. 하지만, Referer 요청 헤더는 조작될 수 있다는 점에서 한계가 있습니다.

GET /page HTTP/1.1
Host: example.com
Referer: https://google.com/search?q=example

👉🏻 서버는 이 요청이 google.com 검색 결과를 클릭해서 온 것임을 알 수 있음

2) CSRF 토큰 사용

템플릿 엔진 기술(JSP, 타임리프, Pug, Ejs 등)을 사용하고 있는 경우라면 CSRF 토큰을 사용해 볼 수 있습니다. 페이지를 생성하기 이전에 사용자 세션에 임의의 CSRF 토큰을 저장합니다. 그리고, 특정 API 요청에 대한 제출 폼을 생성할 때 해당 CSRF 토큰값이 설정된 input 태그를 추가합니다.

<input type = "hidden" name = "csrf_token" value = "csrf_token_12341234" />

실제로 요청이 전달될 때, 해당 input 태그의 CSRF 토큰과 사용자 세션 내부에 존재하는 CSRF 토큰의 일치 여부를 판단하여, CSRF 공격에 대해 방어할 수 있습니다.

3) SameSite 쿠키 사용

웹 브라우저가 쿠키를 요청에 포함시킬 때의 출처(Origin)를 기준으로, 어떤 경우에 허용할지를 제어하는 보안 속성입니다. 즉, 쿠키가 요청에 포함될 수 있는 범위를 제어하여 CSRF(사이트 간 요청 위조) 같은 공격을 막을 수 있습니다.

📌 SameSite 속성 종류

속성 값설명
Strict완전히 같은 출처일 때만 쿠키 전송. 외부 링크 클릭 시 쿠키 안 보내짐.
Lax기본값. GET 요청에 한해 외부 출처에서도 쿠키 전송 허용. POST 등은 안 됨.
None출처에 상관없이 모든 요청에 쿠키 전송. 단, Secure(HTTPS) 필수.

4) 브라우저의 SOP(Same Origin Policy) 정책 사용

웹 브라우저의 보안 정책 중 하나로, 웹 페이지가 자신이 로드된 출처(Origin)와 다른 출처의 리소스에 접근하지 못하도록 제한하는 규칙입니다.

📌 출처(Origin)란?

구성 요소예시
프로토콜http, https
호스트example.com
포트80, 443, 8080 등

👉🏻 http://example.com:80https://example.com:443는 다른 Origin 입니다.

5) CORS 설정

다른 출처(Origin)의 리소스를 요청할 수 있도록 허용하는 HTTP 보안 기능으로, 브라우저의 SOP(Same-Origin Policy) 제한을 우회하기 위한 서버 설정입니다. 자세한 내용은 CORS 문서 참고

Loading comments...