ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시큐리티의 CSRF 그리고 테스트
    스프링 2023. 3. 5. 16:09

    CSRF란 웹 애플리케이션의 취약점 중 하나로, 이용자가 의도하지 않은 요청을 통한 공격을 의미한다.

    (작년 네트워크 보안수업시간에 이를 프로젝트로 구현 / 실습해 본적이 있어서 이해하는데는 큰 어려움이 없었다.)

     

     

    CSRF 공격을 방어하는 방법으로 다음과 같은 방어법이 있다.

    Referrer 검증

    서버단에서 request의 referrer을 확인하여 domain이 일치하는지 검증하는 방법.

    referrer 검증만으로 대부분의 CSRF 공격을 방어할 수 있다.

     

     

    Spring Security CSRF Token

    임의의 토큰을 발급한 후 자원에 대한 변경 요청일 경우 Token 값을 확인한 후 클라이언트가 정상적인 요청을 보낸것인지 확인합.

    만약 CSRF Token이 존재하지 않거나, 기존의 Token과 일치하지 않는 경우 4XX 상태코드를 리턴.

    요청한 파라미터에 Token을 포함한 뒤 전송하여 정상적인 요청인지 혹은 공격자로부터 의도된 요청인지 판단할 수 있다.

     

     

     

     

    OAuth를 테스트 하기 위해서 테스트 코드를 짜고 있었는데,

     

    다음과 같은 에러가 발생한다.

     

    request만 보아도 모든 값이 정상적으로 들어갔는데 말이다.

    .with(csrf()))

     결론적으로는 위와 같은 코드를 추가해 주면 된다.

     

    시큐리티 config 파일을 작성할때

    http.csrf().disable()

    를 써놓는 것을 알 수 있을 것이다.

     

     

    위에서 기술 한 것 처럼 스프링 시큐리티는 CSRF토큰을 이용해 csrf공격을 방지한다.

    1. 서버가 뷰를 만들때 사용자별 랜덤 값을 만들어 세션에 저장하여 이를 뷰 페이지에 같이 담아서 넘긴다.
    2. 클라이언트는 HTTP요청마다 해당 토큰을 같이 넘긴다.
    3. 이때 토큰 값을 비교해서 일치하는 경우만 처리 한다.

     

    따라서 테스트를 진행할 때 with csrf()로 토큰을 같이 담아서 반환 해주도록 하는 것이다.

     

     

    그럼 왜 안전한 csrf 기능을 disable 한걸까??

    csrf 토큰 방식을 살펴보면 각 사용자에 대한 세션을 이용하는 방식이라는 것을 확인할 수 있다. 

    때문에 웹 브라우저를 통한 접근을 하는 경우, 세션/쿠키를 사용해 상태를 유지하려고 하는 경우 csrf를 사용하는 것이 안전하다.

     

    하지만 REST API의 경우는 대개 무상태성을 유지하며 JWT와 같은 토큰 방식으로 인증하게 되면 요청이 세션에 의존하지 않기 때문이다

    728x90

    '스프링' 카테고리의 다른 글

    MultipartFile With Json  (0) 2023.04.03
    Swagger 404 오류  (0) 2023.03.31
    @RequestBody vs @RequestParam  (0) 2023.02.21
    API 예외처리-5 (RestControllerAdvice)  (0) 2023.01.28
    API 예외처리-4 (ExceptionHandler)  (0) 2023.01.28

    댓글

Designed by Tistory.