본문 바로가기

Backend/Web

[CSRF]About CSRF

반응형

CSRF란?

CSRF(크로스 사이트 요청 위조, Cross-Site Request Forgery)는 웹 애플리케이션의 보안 취약점 중 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행동을 웹 애플리케이션에 대해 수행하도록 만드는 공격 기법.

XSS공격과 세트로 공격이 발생하는 경우가 많다.

CSRF 동작 원리

  1. 사용자가 웹 애플리케이션에 로그인하여 세션 쿠키를 받는다.
  2. 공격자는 악의적인 요청을 만들어, 사용자가 클릭하거나 방문할 수 있는 웹 페이지나 이메일 메시지에 삽입한다.
  3. 공격자가 삽입한 링크를 통해 사용자의 브라우저는 사용자의 세션 쿠키를 사용하여 공격자가 준비한 악의적 요청을 웹 애플리케이션에 전송한다.
  4. 웹 애플리케이션은 이 악의적 요청을 정상적인 사용자의 요청으로 인식하고, 요청된 작업(예: 비밀번호 변경, 자금 이체 등)을 수행한다.

CSRF 방어 방법

- CSRF 방어방법 (사용자 입장 )

  • CSRF는 클릭만해도 바로 내가 의도하지 않은 action이 수행될 수 있기 때문에 최대한 의심 가는 링크(다운로드 포함)나 메일 등을 클릭하지 않는 것이 좋다.

 

- CSRF 방어방법 - 웹개발자/운영자 입장

  1. Referer check (리퍼러 체크)
    HTTP 요청 헤더(request header) 정보 중 Referrer 정보를 호스트(host)와 일치하는지 비교한다.
    CSRF 공격의 대부분 Referrer 값에 대한 검증만으로도 많은 수의 공격을 방어할 수 있다.
    // Referrer체크 예시
    public class ReferrerCheck implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String referer = request.getHeader("Referer");
            String host = request.getHeader("host");
            if (referer == null || !referer.contains(host)) {
                response.sendRedirect("/");
                return false;
            }
            return true;
        }
    }​​
  2. CAPTCHA 도입
    요청시에 CAPTCHA 를 이용하여, CAPTHCA 인증코드가 없거나 틀리면 요청을 거부하도록 할 수 있습니다.

  3. CSRF 토큰사용
    사용자 세션에 임의에 값을 저장하여 모든 요청마다 해당 값을 포함하여 전송하도록 한다.
    서버에서 요청을 받을때마다, 세션에 저장된 값과 요청으로 전송된 값이 일치하여 검증하여 방어하는 방법이다.
    // 로그인 처리 Controller에서 session value에 CSRF_TOKEN값 저장
    session.setAttribute("CSRF_TOKEN", UUID.randomUUID().toString());
    
    // JSP단
    <!---요청시 CSRF_TOKEN 값을 전송하도록 해줌---->
    <form action="http://example/path" method="POST">
       <input type="hidden" name="CSRF_TOKEN" value="${CSRF_TOKEN}">
     <!-- ... -->
    </form>
    
    // 요청을 받을시, 인터셉터에서 CSRF_TOKEN값 검증하도록 함.
    public class CsrfTokenInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            HttpSession httpSession = request.getSession();
            String csrfTokenParam = request.getParameter("CSRF_TOKEN");
            String csrfTokenSession = (String) httpSession.getAttribute("CSRF_TOKEN");
            if (csrfTokenParam == null || !csrfTokenParam.equals(csrfTokenSession)) {
                response.sendRedirect("/");
                return false;
            }
            return true;
        }
    }

  4. SameSite 쿠키 속성 사용
    SameSite 쿠키 속성을 사용하여 쿠키가 동일한 출처 요청에서만 전송되도록 합니다. Strict 또는 Lax 설정은 CSRF 공격을 방지하는 데 도움이 됩니다.

 

반응형

'Backend > Web' 카테고리의 다른 글

[Web] about API  (0) 2024.07.25
[보안 취약점] PRG 패턴 (Post-Redirect-Get Pattern)  (0) 2024.07.04
[HTTP] 상태 코드  (0) 2024.03.18
[Api] API문서 작성  (0) 2023.11.29
[Api] Open API 디자인  (0) 2023.11.27