기술 소개

CSRF

개발참치 2021. 10. 17.
CSRF에 대해 간단하게 소개해드리려 합니다.

 

 

CSRF 란?

 

Cross-site request forgery, 사이트 간 요청 위조

 

사이트 간 요청 위조는 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격을 말합니다.

 

 

CSRF의 공격 예시

 

1. 일반적인 CSRF 공격

 

로그인된 상태의 사용자를 이용하여, 사용자의 행동을 위장한 방식

 

  • img 태그를 이용한 방법
    사용자는 아래와 같은 html이 포함된 악의적인 사이트/이메일을 열람할 시 자신도 모르게 요청을 보내게 됩니다.
    <img src="https://test.com/user?action=setPW&pw=1234" width="0" height="0" />

 

  • form 을 이용한 방법
    사용자는 아래와 같은 form이 포함된 악의적인 사이트를 열람할 시 자동으로 에러에 관련된 글을 작성하게 됩니다. 
<form action="http://test.com/api/content" method="post"> 
	<input type="hidden" name="body" value="에러입니다." /> 
	<input type="submit" value="Click Me"/> 
</form> <script> document.forms[0].submit();

 

2. 로그인 CSRF 공격

 

해커의 계정으로 사용자를 몰래 로그인시키는 방식

활동기록들을 갈취해 해커의 계정에 저장

 

  • form을 이용한 방법
    사용자는 아래와 같은 form이 포함된 악의적인 사이트를 열람할 시 자동으로 해커 계정으로 로그인하는 요청을 보내게 된다 
<form method="POST" action="http://test.site/login"> 
	<input type="text" name="user" value="1234" /> 
	<input type="password" name="pass" value="1234" /> 
</form> 
<script> 
	document.forms[0].submit(); 
</script>

 

CSRF 방어법

 

CSRF는 애초에 다른 사이트를 이용하여 요청을 시도하는 공격이기 때문에, 타 사이트의 요청을 막거나 허용된 사이트에서만 오게끔 확인 절차 로직이 필요합니다.

 

1. CORS 적용

 

CORS를 이용해서 사이트 간 요청을 불가능하게 만듭니다.

만약에 CORS를 허용한다면, 사이드 이펙트가 없을 것으로 예상되는 OPTIONS, HEAD, GET 메소드에 대해서만 허용하는 것이 좋다.

하지만 CORS는 <script></script> 사이에서 생성된 XMLHttpRequest 요청에만 해당되기 때문에 위에서 예시로 든 공격을 막을 수 없습니다.

 

2. Synchronizer Token Pattern (csrf token)

 

CSRF 체크를 하는 방법입니다.

 

요청을 받을 때마다 세션에 저장된 토큰값과 요청 파라미터에서 전달되는 토큰 값이 같은지 검증하며 밝히는 방법입니다.

 

랜덤 한 값을 사용자의 세션에 저장하여 사용자의 모든 요청(Request)에 대하여 서버 쪽에서 검증하는 방법

 

  • 서버 사이드 렌더링
<input type="hidden" name="_csrf" value="{{csrfToken}}">

 

  • Ajax 사용
ajax.get('/process', {
  headers: {
    'CSRF-Token': token // <-- is the csrf token as a header
  },
  method: 'POST',
})
</script>

 

  • SPA 앱
app.all('*', function (req, res) {
  res.cookie('XSRF-TOKEN', getCsrfToken())
  res.render('index')
})

 

3. referer 헤더 설정

 

요청을 한 페이지의 정보가 담긴 Referer 헤더 속성을 검증하여 차단하는 방법입니다.

같은 도메인 상에서 요청이 들어오지 않는다면 차단하도록 하는 방법.

일반적으로 이 방법만으로도 대부분 방어가 가능하다고 합니다.

 

 

Security Token 검증의 한 종류로 세션을 사용할 수 없는 환경에서 사용할 수 있는 방법

 

웹브라우저의 Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키 값을 확인/수정하지 못한다는 것을 이용한 방어 기법입니다.

스크립트 단에서 요청 시 난수 값을 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터(혹은 헤더)에도 저장하여 서버로 전송합니다. 서버단에서 쿠키의 토큰 값과 파라미터의 토큰 값이 일치하는지만 검사하면 됩니다.

서버에 따로 토큰 값을 저장할 필요가 없어 세션을 이용한 검증보다 개발 공수가 적은 편입니다.

피싱 사이트에서는 도메인이 달라 쿠키에 값을 저장하지 못하므로(Same Origin 정책) 가능한 방어 기법입니다.

 

쿠키 이름이 __Host- 로 시작하는 것이 좋다고 합니다.

 

'기술 소개' 카테고리의 다른 글

Copilot AI란  (0) 2021.07.23
Serverless의 개념  (0) 2021.07.22

댓글