Cross Origin Resource Sharing(CORS)와 Cross-Site Request Forgery(CSRF)이란?

비슷해서 헷갈리는 개념인 CORS와 CSRF에 대해 알아보자.

Cross Origin Resource Sharing(CORS)이란?

CORS(Cross Origin Resource Sharing)교차 출처 자원 공유란 이는 서버가 다른 출처로부터의 액세스를 허용하거나 제한할 수 있게 하는 HTTP 헤더 기반 매커니즘입니다. 간단하게 말해서 A 사이트에서 B 사이트로 요청을 보낸다고 가정할 때, B 사이트에서 이를 허용할건지 말건지에 대한 설정을 의미한다.

CORS에 대한 예시를 들어보겠습니다. CORS 설정은 요즘 웹 개발을 보통 백엔드, 프론트엔드로 나눠 개발하는 과정에 많이 사용됩니다. 백엔드 코드에서 API를 만들고 이를 프론트엔드 코드에서 호출합니다. 그러면 특별한 설정하지 않은 상태에서는 보통 CORS 에러가 뜹니다. 웹 브라우저 콘솔 창에 이런 에러를 확인한 경험이 있을 겁니다.

...blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

이는 다른 출처에서 요청을 했기 때문에 이를 막았다는 내용입니다. 이를 허용해주기 위해서는 사용중인 프레임워크에 따라 알맞게 개발한 프론트엔드만 CORS 허용해주면 됩니다.

Cross-Site Request Forgery(CSRF)이란?

CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)는 사용자가 신뢰하는 웹사이트에 특정 요청을 위조해서 보내는 공격 기법입니다. CSRF 공격은 웹 애플리케이션이 사용자의 의도와 상관없이, 공격자가 의도한 악성 요청을 서버에 보내도록 만듭니다. 공격자는 이를 통해 사용자의 권한을 악용하여 원하지 않는 작업을 수행하게 합니다.

CSRF 공격 과정을 예시로 들겠습니다. 먼저 사용자가 은행 사이트에 로그인합니다. 그럼 서버에서는 해당 사용자에 대한 세션 정보가 생기고 이 정보는 사용자 웹 브라우저에 쿠키 형식으로 저장됩니다. 이때 공격자는 자신이 만든 악성 사이트를 사용자가 클릭하도록 유도합니다. 만약 사용자가 해당 사이트를 클릭하게 된다면, 악성 사이트는 웹 브라우저에 저장된 은행 사이트의 쿠키 형식 세션 정보를 포함해 은행 사이트에서 악의적인 송금 요청을 유도합니다. 결과적으로 사용자는 공격자에게 돈을 송금하게 됩니다.

이렇게 공격자가 만든 악성 사이트에서 은행 사이트가 이상 요청을 하도록 유도하는 과정이 이루어지므로 이를 Cross-Site Request Forgery라고 부르는 것입니다.

CORS는 CSRF 방지 방법인가?

CORS 정책은 CSRF 공격을 방지하는 데 도움은 될 수 있습니다. 악성 사이트에서 직접적으로 서버에 요청을 보내게 될 경우 이를 방어해주기 때문입니다. 하지만 CORS 설정이 되어 있어도, CORS만으로 CSRF를 방지하는 것은 위험하다고 합니다.

결과적으로 더 정교한 방어를 위해서는 다음과 같은 CSRF 방지 방법을 사용합니다.

CSRF 방지 방법

  • CSRF 토큰 사용

    CSRF 방어의 가장 일반적인 방법은 각 요청에 대해 고유한 CSRF 토큰을 생성하고 이를 서버에서 검증하는 것입니다. 토큰은 사용자에게 발급된 고유한 값으로, 서버가 이를 확인하여 요청이 신뢰할 수 있는지 판단합니다. (이때 CSRF는 쿠키로 제공되지 않습니다. 만약 쿠키로 제공되면 세션 정보 쿠키와 동일해져버리겠조? 거의 HTML 폼에 숨겨진 매개변수로 제공됩니다.)

  • 쿠키 SameSite 속성 설정

    최신 브라우저에서는 쿠키에 SameSite 속성을 설정하여 CSRF 공격을 예방할 수 있습니다. 이 속성을 사용하면 브라우저가 다른 사이트에서의 요청에 해당 쿠키를 포함하지 않도록 설정할 수 있습니다.

    • SameSite=Lax

      기본적으로 외부 사이트에서의 GET 요청에는 쿠키가 포함되지 않지만, 사용자가 링크를 직접 클릭할 경우에는 쿠키가 전송됩니다.

    • SameSite=Strict

      외부 사이트에서의 모든 요청에는 쿠키가 포함되지 않습니다.

  • Referer 헤더 검증

    서버가 요청을 받았을 때, Referer 헤더를 확인하여 요청이 예상된 출처에서 온 것인지 검증할 수 있습니다. 이는 공격자가 사용자를 다른 사이트에서 악성 요청을 보내지 못하도록 막습니다.

  • Double Submit Cookie

    클라이언트 측에서 CSRF 토큰을 쿠키와 함께 서버로 전송하고, 서버는 해당 쿠키와 요청 본문이나 헤더의 토큰 값을 비교하여 일치하는지 확인합니다.

results matching ""

    No results matching ""