JWT 사용 시 Spring Security 에서 csrf.disable() 을 해도 괜찮은 이유는 무엇일까?
에 대해서 심각하게 고민하게되어 정리하게 되었다.
Cross-Site Request Forgery
웹 애플리케이션의 취약점 중 하나로, 이용자가 의도하지 않은 요청을 통한 공격을 의미한다.
즉, CSRF 공격이란, 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(등록, 수정, 삭제 등)를 특정 웹사이트에 요청하도록 만드는 공격이다.
예시
로그인한 계정에서 다른 은행 계좌로 돈을 송금할 수 있는 은행 웹사이트 제작
예시. Form 형식
<form method="post"
action="/transfer">
<input type="text"
name="amount"/>
<input type="text"
name="routingNumber"/>
<input type="text"
name="account"/>
<input type="submit"
value="Transfer"/>
</form>
Http 요청
POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid
Content-Type: application/x-www-form-urlencoded
amount=100.00&routingNumber=1234&account=9876
은행 웹사이트에 로그인 한 뒤, 로그아웃하지 않고 다른 악의적인 사이트에 방문했다고 가정
웹 사이트엔 다음과 같은 폼이 존재한다.
<form method="post"
action="https://bank.example.com/transfer">
<input type="hidden"
name="amount"
value="100.00"/>
<input type="hidden"
name="routingNumber"
value="evilsRoutingNumber"/>
<input type="hidden"
name="account"
value="evilsAccountNumber"/>
<input type="submit"
value="Win Money!"/>
</form>
이처럼 악의적인 폼에 접근하면 의도치않게 악의적인 사용자에게 100달러를 송금하게 된다.
하지만 Stateless 한 Rest API에서는 CSRF로부터 비교적 안전하다는 주장이있다.
Spring Security 공식 문서
When to use CSRF protection
When should you use CSRF protection? Our recommendation is to use CSRF protection for any request that could be processed by a browser by normal users. If you are only creating a service that is used by non-browser clients, you will likely want to disable CSRF protection.
위 내용을 보면 CSRF protection 기능은 브라우저를 통해 Request를 받을 때 사용해야한다고 말하고 있다.
즉, SPA(Single Page Application) 방식으로 개발이 된 RestAPI 서버는 해당 기능을 사용하지 않아도 된다.
따라서, Json Web Token 을 이용하여 LocalStorage에 저장 후 통신하는 방식으로 사용한다면 안전할 수 있다.
LocalStorage는 쿠키와 다르게 Js 코드에 의해 헤더에 담기므로 XSS를 뚫어 LocalStorage 값에 접근하지 않는 이상 공격자가 request를 보내기가 어렵다.
참조
https://docs.spring.io/spring-security/site/docs/5.3.x/reference/html5/#csrf
https://docs.spring.io/spring-security/site/docs/5.3.x/reference/html5/#servlet-csrf
https://velog.io/@kmlee95/JWT%EC%9D%98-%EC%95%88%EC%A0%84%ED%95%9C-%EC%A0%80%EC%9E%A5%EC%86%8C
https://wave1994.tistory.com/150
'Spring Security' 카테고리의 다른 글
Authentication과 SecurityContextHolder (0) | 2021.06.03 |
---|---|
AuthenticationManager와 Authentication (0) | 2021.06.02 |
SecurityContextHolder와 Authentication (0) | 2021.06.02 |
댓글