Rest Api 서버에서의 CSRF방어와 JWT (JWT 도입)

이형석·2024년 4월 15일

WelCheck 프로젝트 

목록 보기
14/22

((프로젝트 이슈이자 사담))
이번에 공부한 Spring Security를 이용해 로그인 기능을 개발하고 나서, Postman으로 테스트를 해보려다 문제에 부딪혔다. 로그인을 처리하는 컨트롤러 메서드가 Spring Security 안에 구현되어 있다고 하여 따로 만들지 않고 넘어갔는데, Postman으로 요청을 테스트하려고 보니 로그인 폼 데이터를 어떻게 전달해야 할지 모르겠는 것이었다.(일단 쿼리스트링 형식이겠지만 key의 이름이 무엇인지도 모르고, 헤더의 다른 옵션도 설정해주어야 하는 것 같았다)
이를 찾기 위해 열심히 구글링을 하였으나 알게 된 것은 Rest Api 방식으로 회원서비스를 구현할 때는 죄다 Spring Security + JWT를 이용해 개발한다는 것이었다. 그래서 JWT에 대해서 찾아보던 중 CSRF에 관한 내용이 나왔는데, 이 부분이 흥미로워서 글로 남겨본다.

구글링을 해보면 대부분의 Restful Api 프로젝트에서 다음과 같이 Spring Security의 Configuration 클래스에서 csrf공격 프로텍트를 비활성화 해주고 있다.

http.csrf((auth) -> auth.disable());

위 코드가 없을 시(csrf공격 프로텍트 활성화 시) csrf 토큰을 다뤄주지 않으면 클라이언트 요청이 막히길래 나도 따라서 해당 코드를 추가하긴 했지만, 사실은 csrf에 대해서 제대로 알아보지 않고 넘어갔었다.

그런데 JWT와 관련된 영상을 보다가 댓글에 csrf에 관한 글을 발견했다. 이 영상 제목은 "JWT 대충 쓰면 님들 코딩 인생 망함"인데 요지는 JWT를 다루면서 보안적인 요소를 잘 인지하고 처리해야 한다는 것이었다. 그리고 댓글의 내용은 다음과 같았다.

여기서 csrf가 왜 나오는지, 그 csrf가 대체 뭔지 갑자기 급 궁금해져서 이참에 알아 보고자 한번 찾아보았다.

CSRF (Cross-site request forgery) _사이트간 요청 위조

csrf란 사용자가 인증한 세션에서 웹 애플리케이션이 정상적인 요청과 비정상적인 요청을 구분하지 못하는 점을 악용하는 공격 방식이라고 한다.
쉽게 말해, 공격자의 요청이 사용자의 요청인 것처럼 속이는 공격 방식이다.

그리고 Spring Security에서는 이 csrf공격에 대한 프로텍트 기능을 Default로 활성화 하여 제공해주고 있다.

그런데 위에서 처럼 Rest Api 서버에서 csrf공격 프로텍트를 직접 비활성화 해주는 이유는 참고한 글을 인용하면 다음과 같다고 한다.

rest api를 이용한 서버라면, session 기반 인증과는 다르게 stateless하기 때문에 서버에 인증정보를 보관하지 않는다. rest api에서 client는 권한이 필요한 요청을 하기 위해서는 요청에 필요한 인증 정보를(OAuth2, jwt토큰 등)을 포함시켜야 한다. 따라서 서버에 인증정보를 저장하지 않기 때문에 굳이 불필요한 csrf 코드들을 작성할 필요가 없다.

위 내용만으로 완전히 이해가 되지 않아서 ChatGPT에게 JWT가 어떻게 CSRF공격을 방어할 수 있는지 다시 한번 물어 보았다.

CSRF 공격은 주로 브라우저의 쿠키를 이용하여 인증을 하는데, JWT는 이와 다른 방식으로 작동합니다. 브라우저는 JWT를 요청 헤더에 실어 서버로 보내는데, 이때 서버는 JWT를 검증하여 요청의 유효성을 판단합니다. 그래서 JWT를 사용하면 요청이 유효한지 서버가 검증하기 때문에 CSRF 공격에 강력한 방어 수단이 될 수 있습니다.

여기까지 종합해보면, 공격자가 악의적인 요청을 보내도 요청을 검증하기 위한 인증 정보가 JWT에 담겨 있으므로 서버가 이를 검증할 수 있어서 CSRF 공격을 방어할 수 있다는 것 같다.

그래서 개인적인 결론은 Rest Api 서버에서는 결국 여러모로 JWT를 쓰는 것이 맞다 정도로 정리할 수 있을 것 같다. 따라서 이번에 추가한 Spring Security에 더해서 JWT를 공부한 후, 현재까지 개발된 회원서비스(회원가입, 로그인)을 리팩토링 할 계획이다.

* 본문의 내용은 다음 글들을 (상당히) 인용했다.
https://nordvpn.com/ko/blog/csrf/
https://velog.io/@wonizizi99/SpringSpring-security-CSRF%EB%9E%80-disable


+ 더 깔끔한 정리 _참고 추천
[TIL] CSRF공격과 대응 방법

profile
금융IT 개발자

0개의 댓글