- CSRF (Cross Site Request Forgery)
: 직역을 하면 사이트간 요청 위조 라는 의미로, 유저가 자신의 의지와는 무관하게 공격자가 의도한 행동을 해서 특정한 웹페이지 보안을 취약하게 만들거나, 수정, 삭제, 등록 등의 작업을 하게 만들어 공격하는 방법을 말한다.
예를들면,
2008년 옥션에서 발생한 해킹 사건이 있었는데, 그 해킹 수법도 CSRF 를 이용했다고 한다.
옥션 관리자 중 한명이 관리자 권한으로 사내에서 작업을 하던 중 메일을 조회했고, 관리자 권한으로 사내에서 작업하고 있었기 때문에 유효한 쿠키값을 갖고 있는 상태에서 메일을 조회했던것이다.
그리고 이메일에 해커가 숨겨놓은 코드가 실행되서 관리자의 id 와 pw 를 탈취하는 그런 경우가 있었다.
- 방어 방법
1. Referrer 검증
request header 에 있는 요청을 한 페이지의 정보가 담긴 referrer 속성을 검증해서 차단하는 방식.
request header 내부에 보면, referrer 라는 속성값이 있는데, 보통은 이 값이 같은 도메인 값이 들어오게 된다.
예를들어, 지금이 블로그 사이트인 sdy-study.tistory.com 의 상위 도메인인 tistory.com 이 referrer 값으로 들어가 있는데,
위의 옥션 해킹 사건의 경우 옥션이라는 도메인과 일치하지 않는 개인 이메일에서 오는 요청인 경우 그런 요청을 아예 차단시켜버리면, 2008년 해킹 사건 처럼 해킹당하지는 않았을것이다.
(대부분의 CSRF 공격의 경우, Referrer 값만 검증해서 처리하면 막을 수 있다고 한다)
2. CSRF Token 사용
: 랜덤한 값을 사용자의 세션에 저장해서 사용자의 요청을 서버단에서 검증하는 방식이다.
(세션 인증 방식 (참고) : sdy-study.tistory.com/44 )
Spring Security 의 경우 기본적으로 유저의 요청 헤더에 CSRF token 이 들어 있지 않으면, 403 에러가 뜨게 된다.
다행히도 Spring Security Filter 에서 이를 위한 CSRF token 을 알아서 만들어준다.
토큰값을 알아서 만들어주고(synchronizer token pattern 을 통해서 토큰 생성) 브라우저를 통해서 유저에게 넘겨주는데,
이를 넘겨받은 유저가 다음 요청을 보낼때 마다, Spring Security Filter 가 요청에 포함된 토큰값을 비교해서 검증된 유저인지 아닌지 파악한다.
(다만 Spring Security 가 자동으로 만들어주는 토큰을 사용하고 싶으면 jsp 파일에 form 태그를 그냥 <form> 태그를 쓰는게 아니라, spring mvc 가 제공하는 <form:form> 태그를 써야한다)
물론 자동으로 만들어주는 토큰 말고도 직접 랜덤하게 생성하는 코드를 짜서 넣을 수 도 있다.
login form 이 담긴 jsp 파일에 <form> 태그로 작성한 경우에 한해서
<form action="생략.." method="POST">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
|
cs |
위와 같이 input 태그를 넣어주면 된다.
이렇게 넣어주면 spring security 가 랜덤하게 CSRF token 값을 만들어준다.
(다만 <form:form> 태그를 쓸 경우 이런 input 태그를 넣지 않아도 된다)
3. CAPTCHA
요즘 사이트들에서 볼 수 있는 reCAPTCHA 같은 방식을 말하며,
이미지가 불일치하거나 문자가 불일치하면 요청을 거절하는 방식이다.
4. Double Submit Cookie
: Security Token 검증의 한 종류로 세션을 사용할 수 없는 환경에서 쓰는 방법이다.
웹 브라우저의 Same Origin 정책으로 인해서 JS 에서 타 도메인의 쿠키값을 확인하거나 수정하지 못한다는 것을 이용해서 방어하는 기법을 말한다
스크립트 단에서 요청시 난수 값을 생성해서 쿠키에 저장하고 동일한 난수 값을 요청 파라미터 (또는 요청 헤더) 에 저장해서 서버로 전송하고, 서버 단에서 쿠키의 토큰값과 파라미터의 토큰값이 일치하는지 검사하는 방식이다.
서버에는 따로 토큰을 저장하지 않는다는게 특징이다.
피싱 사이트에서는 도메인이 다르므로, 쿠키에 값을 저장하지 못해서 방어가 가능해진다.
- References)
1. sj602.github.io/2018/07/14/what-is-CSRF/
2. velog.io/@dnjscksdn98/Network-CSRF%EB%9E%80
'Spring' 카테고리의 다른 글
Spring Security - User Registration (0) | 2021.03.07 |
---|---|
Spring Security - User Roles (0) | 2021.03.06 |
Spring Security - Custom Login Form (0) | 2021.03.05 |
Spring Security - Configuration (0) | 2021.03.05 |
Spring Security - Overview (0) | 2021.03.04 |