1. CSRF 공격이란?
- 위조된 사이트에서 클릭을 통해 사용자가 의도하지 않은 요청을 특정 사이트로 전송하는 공격입니다.
- 공격자가 피해자의 웹 브라우저를 통해 웹 사이트에 대한 위조된 요청을 생성하는 공격입니다.
- 의도하지 않은 요청에 대한 인증은 브라우저의 쿠키정보를 사용하여 통과합니다.
- 사용자의 쿠키정보가 브라우저에 남아있는 점을 이용합니다.
example
- 사용자가 은행 웹사이트에서 이체 거래를 마쳤습니다.
- 사용자는 메일 확인중, 모르는 자로부터 링크가 담긴 메일을 받았습니다.
- 사용자는 경각심없이 메일의 링크를 클릭하였습니다.
- 링크를 통해 이동한 웹 페이지에는 클릭만 하면 상품을 준다는 버튼이 있었습니다.
- 사용자는 클릭을 하였습니다.
- 이 버튼은 이전에 사용자가 사용했던 은행 웹사이트로 송금을 요청하는 버튼이었습니다.
- 송금 요청은 인증된 사용자만 접근할 수 있는 보안 URL입니다.
- 보안 URL을 접근하기 위해 사용자의 인증 정보가 같이 전송되어야 합니다.
- 버튼은 사용자의 쿠키 정보에 인증정보가 들어있으며 브라우저에 남아있다는 점과 자바스크립트로 접근할 수 있다는 점을 노렸습니다.
- 해당 자바스크립트 코드는 브라우저의 쿠키에 인증정보에 접근하여 요청시에 쿠키로 사용하여 인증을 통과하였습니다.
- 이로인해 사용자는 악의적인 공격자에게 금액을 송금하는 피해를 받게 됩니다.
2. CSRF 방어
멱등성을 가진 안전 HTTP 메서드
- CSRF 공격을 방지하기 위해 무상태 요청은 멱등성을 가져야 합니다.
- 무상태 요청 : GET, HEAD, OPTIONS, TRACE
Synchronizer Token Pattern
- HTTP 요청 시, HTTP 헤더에 랜덤한 보안 문자를 전송하는 방어기법
- '_csrf' 라는 HTTP parameter 값으로 전송됩니다.
- 서버 자신이 보관하고 있는 진짜 CSRF Token과 전송된 CSRF Token의 비교를 통해 유효성을 검증합니다.
- CSRF Token은 브라우저에 보관되지 않습니다.
- 보안을 위해 쿠키 형태로 보관되지 않습니다.
- 상태 변경 요청에 한해 사용됩니다.
- 보통 외부 링크 접속시 GET으로 접근하게 됩니다
- 외부 링크 접속은 수많은 요청이 들어올 수 있습니다.
- 상태를 바꾸지 않는 요청인데도 이럴때마다 CSRF Token이 발급된다면 서버에 큰 부담을 줍니다.
- Safe HTTP Method는 반드시 멱등성을 가져야 합니다.
- 상태를 변경하는 요청일 때만 CSRF Token이 요구됩니다.
- 보통 외부 링크 접속시 GET으로 접근하게 됩니다
SameSite Attribute
- 요청 쿠키에 대해 Site 제약을 두는 Cookie Attribute 입니다.
- Strict
- 반드시 동일한 출처로부터 요청이 들어와야 합니다.
- Lax
- 동일 출처 허용
- 사용자가 주소창에 URL을 직접 입력하여 접속 허용
- 외부 사이트의 링크를 클릭하여 접속 허용
- 해당 속성을 통해 악의적인 공격자 사이트로부터의 요청이 효력을 잃습니다.
Content-Type 검증
- CSRF 공격이 서버가 처리하는 폼 데이터의 Content-Type을 알지 못합니다.
- 약속된 Content-Type으로 들어온 요청인지 검증함으로써 방어층을 추가하는 효과를 가질 수 있습니다.
3. CSRF 고려사항
Login
- 악의적인 공격자는 피해자에게 자신의 계정으로 로그인된 웹 사이트에 접속하도록 유도합니다.
- 피해자는 로그인된 계정으로 웹 사이트를 방문하다가 자신의 민감정보를 제출하도록 유도받습니다.
- 이를 위해 session timeout을 사용합니다.
Logout
- 악의적인 공격자로부터 민감정보 노출 방지를 위해 강제적인 로그아웃이 필요합니다.
- 이를 위해 session timeout을 사용합니다.
Session Timeout
- CSRF Token은 session에 포함됩니다.
- 이러한 경우 session이 만료되면 CSRF Token도 찾을 수 없습니다.
- CSRF Token을 매 요청 직전에 따로 요청해서 응답받기
- session이 곧 expired될 때, 사용자에게 알리기
- CSRF Token을 쿠키에 저장하기
- 공격자에 의해 접근이 가능하므로 여러 보안장치를 가져야 합니다.
- 보안관련 쿠키 속성 사용하기
Multipart
- Multipart request로부터 CSRF 공격을 방어하는데 문제가 있습니다.
- CSRF Token을 Body에 둘 경우
- CSRF Token을 읽기 위해 Body를 읽는 순간 Multipart 내용의 파일이 서버로 업로드됩니다.
- CSRF Token을 URL에 둘 경우
- 파일 업로드 문제는 예방할 수 있습니다.
- 그러나 쿼리스트링에 둘 경우, CSRF Token이 노출됩니다.
참고
'Spring > Spring Security' 카테고리의 다른 글
[Spring Security] 4-3. 보안: HTTP (0) | 2023.10.14 |
---|---|
[Spring Security] 4-2. 보안: Security HTTP Response Headers (2) | 2023.10.14 |
[Spring Security][KoLiving] 4-5. BlackList Token (0) | 2023.10.03 |
[Spring Security][KoLiving] 4-4. RefreshToken Rotation (0) | 2023.10.03 |
[Spring Security][KoLiving] 4-3. RefreshToken (2) | 2023.10.03 |