본문 바로가기

Java

Spring Security - csrf는 무엇이며, 왜 disable하는 경우가 많은가?

반응형

글을 쓰기에 앞서 왜 이미 알고 있는 내용을 정리하는가?

1년간 데이터분석에 파이썬만 만졌더니 자바 웹기술에 대한 내용들이 뭔가 뿌옇게 흐려진 느낌이다.

그래서 내가 어디까지 모르는지 잊어버린 것은 없는지 확신을 얻기 위해 순차적으로 정리해보기로 했다.

 

1. CSRF란?

우선 csrf 라는 용어의 정의부터 잊지 않았는지 짚고 가자면..

희끄무리하지만 내 기억상 웹사이트에서 위조요청을 날리는 일종의 보안 위협요소이다.

xss(cross site script)의 경우, 스크립트를 이용한 경우라면,

csrf(cross site request forgery)는 요청 자체를 위조해서 권한을 취득하는 등의 행위를 이용하는 것이다.

해당 방식은 공격자가 인가자(권한이 있는 자)를 이용해 특정 요청을 하게 하는 방식이라고 보면 되는데,

그에 따라 세션/쿠키를 사용하는 경우, 인가자는 csrf 공격에 노출될 수 있게된다.

 

이것을 방지하기 위한 게 CSRF Protection이라고 보면 된다.

방식은 웹페이지에 특정 토큰을 넣어주고 요청이 들어올 때 해당 토큰을 함께 보내주게끔 하여,

위변조된 요청일 경우, 실제 인가자가 가지고 있는 토큰이 Request에 제대로 들어있지 않을 것이므로, 해당 요청을 발라내어 방어하는 형태이다.

 

희끄무리해서 순간 당황했지만 그나마 다행인건.. csrf가 무슨 약자인지 안까먹었다는 것!

음... 솔직히 말하자면... 약자도 순간 생각 안났는데, xss를 떠올리자마자 기억이 돌아왔다.. xss는 학부시절 많이했던 실습도 실습이지만.. 원채 유명해서 까먹을 수가 없네.. 끊어졌던 뉴런들이 다시 이어지는 느낌이랄까...ㅎㅎ

 

순간 stateless는 그냥 disable 밖에 생각이 안났는데.. 약자 풀어서 다시 생각해보니 다행스럽게(?) 다시 정의가 떠올랐다..

타의에 의해 java를 못쓰고 있었지만 조금씩이라도 사용하며 안놓기를 잘했다는 생각이 든다.

칭찬해 내 자신 :)

 

2. Disable 하는 이유

그렇다면 왜 disable하는 경우가 많을까?

우선 한가지 짚고 가자면, 위에서 말했듯 stateless 방식을 사용할 경우, disable하는 경우가 많은 것이다.

애초에 REST API와 OAuth2, JWT를 사용한다면, 세션 같은 방식을 사용하지 않는다는 것이니, 인가자를 우회한 위조요청은 성립이 되지 않는다(기본적으로 non-browser client라면 성립이 안된다고 보면 된다). 또 애초에 API를 요청할 때 별도 OAuth2 정보가 달려서 나가는데, csrf 토큰을 또 하는 것도 의미가 없는 것이 아닌가 생각된다.

 

그 외에 Disable되어 있는 경우는 개발 초기에 편의를 위해 꺼둔 것 말고는 보통 켜둔다고 보면 된다.

아니 애초에 안끄면 Default로 켜져있다..

(그런데 요즘 트렌드가 MSA에 Backend, Frontend 구분해서 React 같은 곳에서 API 불러쓰는데... 보통 켜둔다고 보는 게 이제 맞는지는 모르겠다.. 음.. 예전에 JSP나 Thymeleaf 써서 개발했던 기억에는 많이 켜두었었다).