ExpressJS CSRF
사용자의 의자와 무관하게 해커가 의도한 행위(결제/수정/삭제 등)을 특정 웹사이트에 요청하게 하는 사이트간 요청 위조 공격 방법
사이트 간 요청 위조는 특정 웹사이트가 사용자의 브라우저를 신용하는 상태를 노리는 의미이다.
쇼핑몰 사이트에 로그인된 사용자가 있다고 가정해 보자. 해커는 쇼핑몰 관리자인 거처럼 속여 사용자에게 개인 정보 보안 강화를 위한 내용으로 이메일을 보낸다. 사용자가 이메일 속 링크를 클릭하는 순간 로그인돼있는 사용자의 패스워드를 해커가 요청한 패스워드로 변경한다. 해커는 변경된 패스워드로 쇼핑몰을 이용할 수 있다. 우리가 알고 있는 2008년 옥션 1000만 회원 정보 유출 사건도 CSRF(Cross-Site-Request-Forgery) 공격 방법이 사용되었다. CSRF 공격은 직접 사용자의 컴퓨터를 해킹하거나 감염시키는 방법이 아니므로 공격이 성공하려면 사용자가 로그인 상태이고 해커가 의도한 피싱 사이트에 접속해야 한다는 조건이 있다.
csurf
익스프레스에서는 CSRF 공격에 대비할 수 있는 csurf 라이브러리를 제공한다. csurf는 해시화된 토큰이다. 토큰을 사용자의 상태가 변경되는 모든 라우터(폼 데이터)에 포함시키면 최초 발급 토큰과 사용자가 보유한 토큰이 맞는지 검사해 준다. csurf 토큰은 서버에서 랜더링되는 화면이 아닌 경우 포함되지 않으며 무작위 해시값이라 추측할 수도 없다.
csurf 모듈 임포트 후 실행시킨다. 옵션이 여러 가지가 있으므로 공식 사이트를 참고하면 된다.
쿠키에 csurf 토큰을 저장하므로 cookieParser 미들웨어보다 아래에 위치해야 한다. 모든 라우터에 csrfProection 함수가 실행되면서 req.scrfToken()이라는 메서드를 사용할 수 있다.
req.scrfToken을 사용하여 프론트로 토큰을 보낸다. 요청 폼 형식의 csurf 토큰을 포함시켜 요청해야 한다. 보통 Ajax 요청 시 메타 태그로 많이 넣어두고 폼 데이터는 위 형식을 사용한다. 주의할 점은 토큰을 포함시킬 태그 name 값을 반드시 _csrf로 적어줘야 한다.
'서버 > Express' 카테고리의 다른 글
ExpressJS nodemailer 비밀번호 초기화 (0) | 2022.06.21 |
---|---|
ExpressJS moment (0) | 2022.06.20 |
ExpressJS Sequelize transaction (0) | 2022.06.17 |
ExpressJS MySQL CRUD (0) | 2022.05.14 |
ExpressJS CORS(Cross-Origin-Resource-Sharing) (0) | 2022.03.28 |