CSRF란
- Cross Site Request Forgery으로 사이트 간 요청 위조를 의미함
- 사용자가 특정 행위를 웹사이트에 요청하도록 하는 공격(사용자의 의지X)
- 해커의 요청이 사용자의 요청인 것 처럼 속이는 방법
CSRF 동작원리
CSRF 공격이 성공하기 위해서는 3가지 조건을 만족해야 한다.
- 사용자가 보안이 취약한 사이트에 이미 로그인이 되어 있는 상태
- 쿠키 기반의 서버 세션 정보를 획득할 수 있어야 함
- 해커는 서버를 공격하기 위한 요청 방법에 대해 미리 파악하고 있어야 함
위의 3가지 조건을 만족한다면 아래와 같은 절차로 동작한다.
- 사용자가 사이트에 로그인
- session ID가 사용자의 브라우저 쿠키에 저장
- 해커는 사용자가 악성 스크립트 페이지를 누르도록 유도
- 악성 스크립트가 작성된 페이지에 접근하게 되면 웹 브라우저에 의해 쿠키에 저장된 session ID와 함께 서버로 요청
- 서버는 쿠키에 담긴 session ID를 통해 해당 요청이 인증된 사용자로부터 온 것이라고 판단하고 처리함
공격예시
실제 2008년 옥션에서 CSRF 공격으로 1800만명의 개인정보가 유출되는 사건이 있었다.
...
<img src="http://auction.com/changeUserAcoount?id=admin&password=admin" width="0" height="0">
...
- 옥션 관리자 중 한 명이 관리 권한을 가진 계정으로 메일을 조회(관리자로서 유효한 쿠키를 가지고 있었음)
- 해커는 위와 같은 코드가 담긴 이메일을 보낸다. 크기가 0이므로 사용자는 인지하지 못한다.
- 사용자가 이메일을 열면 이미지 파일을 받아오기 위해 url이 열린다.
- 해커가 원하는 대로 특정 계정의 권한이 admin으로 변경된다.
CSRF 방어방법
결국 누구의 요청인지를 판단하는게 관건인 것 같다.
사용자가 요청한 것이 맞는지 확인하거나 재인증을 요구하는 등의 조치를 취한다.
- Referrer-Header 확인
HTTP 요청 헤더 정보에서 Referer 정보를 확인할 수 있다.
(Referer 헤더란 요청이 발생한 페이지의 url이 담긴 헤더이다.)
다른 도메인에서 보낸 요청이 경우 차단하는 방법이다.
대부분의 CSRF 공격은 Referer-Header 검증으로 방어할 수 있다.
- Captcha 도입
사용자가 실제 사람인지 컴퓨터 시스템인지 구별하기 위해 사용되는 방법이다.
사람이 아니라고 판단한다면 요청을 거부한다.
JWT
먼저 토큰 인증 방식은 토큰(인증 정보)를 서버가 아닌 클라이언트 측에 저장하는 방식이다.
하지만 토큰 식에는 한계가 존재한다. 토큰이 탈취당한다면?
위에 나온 세션 방식과 다를게 없는 것이다.
이런 한계를 극복하기 위한 방법이 JWT이다.
JWT는 access Token과 Refresh Token 두 가지를 발급해준다.
발급받은 토큰은 클라이언트 측에 저장되어야 하는데,
일반적으로 localStoarge, Session Storage, Cookie 셋 중에 한 곳에 저장한다.
이 중 어떤 곳을 선택해야 할까?
- sessionStoarge
sessionStoarge는 현재 띄워져있는 브라우저에서만 값이 유지된다.
새로고침으로 사라지지 않지만, 브라우저를 닫고 다시 연다면 데이터가 사라진다.
- localStoarge
localStoarge는 브라우저를 닫고 다시 열어도 데이터가 유지된다는 편리함이 있다.
하지만 스크립트로 접근이 가능하기 때문에 XSS 공격에 취약하다.
- cookie
cookie는 네트워크 요청 시 자동으로 포함되어 전송되기 때문에
프론트엔드 측에서 저장소에 토큰을 저장하고 전달하는 등의 추가적인 처리가 필요하지 않다는 장점이 있다.
sessionStoarge와 localStorage는 JS로 접근할 수 있기 때문에 XSS에 취약하다.
옵션 없이 작동되는 cookie는 CSRF와 XSS 공격 모두에 취약하다.
하지만 쿠키의 옵션을 사용한다면 CSRF와 XSS 공격을 막을 수 있다.
http only 속성을 사용하면 document.cookie와 같은 스트립트 실행 막아주기 때문에 XSS 공격에 대비할 수 있고
secure 속성을 사용하면 https 요청일 때만 전송하기 때문에 http로 이루어지는 CSRF 공격에 대비할 수 있다.
보안이 취약한 웹사이트를 방문하거나 수상한 메일을 열어보는 등의 행동은 자제하는게 좋겠다!
'WEB' 카테고리의 다른 글
[WEB] 브라우저 렌더링 과정 (0) | 2024.07.03 |
---|---|
[WEB] XSS (0) | 2024.07.02 |
[WEB] HTTP/1.0, HTTP/1.1, HTTP/2, QUIC(HTTP/3) (0) | 2024.06.27 |
[WEB] HTTP vs TCP (0) | 2024.06.24 |
[WEB] CDN (0) | 2024.06.17 |