CSURF

데이터 해킹 3가지

  1. XSS
  2. SQL Injection
  3. CSRF

CSRF

크로스 사이트 요청 위조(Cross-site request forgery)의 약어로 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.
유명 경매사이트인 옥션에서 발생한 개인정보 유출 사건에서 사용된 공격 방식 중 하나다.
쿠키를 통한 인증방식에서 사용되는 공격기법이다.

공격과정

  1. 이용자는 정상적인 쿠키를 얻는 로그인을 진행한다.
  2. 공격자는 이미지 태그 안에 공격코드를 작성하여 이용자에게 보낸다.
    1
    <img src="http://ttticketttt.org/ticket-cancel/?user_id=134">
  3. 이용자가 공격용 페이지를 열면, 브라우저는 이미지 파일을 받아오기 위해 공격용 URL을 연다.
  4. 이용자는 의도치 않게 실행하는 순간 브라우저에서 요청을 보내서 공격이 실행되게 된다.

CSURF

CSRF Secret와 Token을 만들어서 서로 매칭이 되는지 확인하는 기능을 제공합니다.
Secret는 session에 저장하고 Token은 POST body에 저장합니다.
POST body에 토큰을 저장하려면 form 작성 시 직접 포함해야합니다.
Secret와 Token은 사용자마다 모두 다릅니다.
하지만 매칭 시 사용자마다 Secret와 Token은 일치하도록 만들어져있습니다.

CSURF 사용방법

1
npm install csurf

터미널에서 위 코드를 실행하여 csurf를 설치합니다.

1
2
3
const csurf = require('csurf')
const csrfMiddleware = csurf()
app.use(csrfMiddleware)

위 코드와 같이 작성하여 app에서 사용 가능하도록 합니다.

1
2
3
app.get('/', (req,res)=>{
res.render('index.ejs',{csrfToken: req.csrfToken()})
})

위 코드와 같이 render되는 부분에 csrfToken을 추가합니다.

1
2
3
<form>
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
</form>

form태그 안에 submit하는 부분이 있다면 hidden타입으로 csrfToken을 숨겨 POST하도록 합니다.
위 코드와 같이 작성하면 render되는 부분과 POST될 때 토큰을 비교하여 보안코드가 일치하는지 확인합니다.

공유하기