[Spring Boot] csrf 공격과 대응 방법

Juice-Han·4일 전
0

Spring Boot

목록 보기
3/3
post-thumbnail

csrf 공격이란?

= Cross-Site Request Forgery

웹 애플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 해서 특정 웹 페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법

공격 과정

  1. 공격자가 CSRF 스크립트가 담긴 게시글을 작성한다.
  2. 다른 사용자가 해당 게시글에 접근한다.
  3. CSRF 스크립트가 사용자의 권한으로 실행된다

예시

공격자가 해당 사이트의 url 패턴을 분석하여 계정 정보를 바꾸는 url을 알아낸다.

그 후 자신이 원하는대로 계정을 바꾸는 링크를 게시글이나 메일에 올려서 사용자가 접속하도록 한다.

http://example.com/user/update?user=abcd&password=1234

이 링크를 누른 사용자의 아이디는 공격자가 미리 지정해놓은 대로 바뀌게 되고, 이를 통해 해킹이 가능하게된다.

예방 방법

서버에 http 요청을 보낼 때 특정 토큰을 함께 보내도록 강제해서 사용자가 의도한 요청만 실행되도록 한다.

서버에서 사용자에게 웹페이지를 전달할 때 토큰을 전달하고, 사용자가 그 페이지에서 http 요청을 보내면 전달받은 토큰을 함께 받아 토큰 값을 검증하는 방식이다.

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Join Page</title>
</head>
<body>
join page
<br>
<form action="/joinProc" method="post" name="joinForm">
    <input id="username" type="text" name="username" placeholder="id"/>
    <input id="password" type="text" name="password" placeholder="password"/>
    <input type="hidden" name="_csrf" value="{{_csrf.token}}"> <!-- 요청할 때 토큰을 함께 보낸다. -->
    <input type="submit" value="join"/>
</form>

</body>
</html>

회원가입 페이지의 html 코드이다.

서버는 해당 페이지를 사용자에게 보낼 때 토큰값을 끼워넣어 함께 보내고, 사용자가 http 요청을 하면 다시 토큰을 받아 이전에 보냈던 토큰과 일치하는 지 확인한다.

이를 통해 사용자는 항상 자신이 의도한 요청만 할 수 있게 된다.

Spring Security에서의 csrf 대응 방법

스프링 시큐리티는 기본적으로 csrf 토큰을 전달해서 공격을 방어한다.

그래서 처음 스프링 시큐리티를 배울 때 이 옵션을 disable하라고 한다. 왜냐하면 추가적으로 해야할 일이 생기기 때문이다.

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

(config 클래스에서 해당 코드를 작성하면 csrf 옵션이 비활성화된다.)

모든 폼 타입의 요청에서 csrf 토큰 코드를 작성하지 않으면 요청이 받아들여지지 않는다.

따라서 초보자는 처음 배울 때 해당 옵션을 비활성화 하고 나중에 숙련이 되면 코드를 추가하는 식으로 csrf 설정을 하게된다.

profile
배우고 기록하고
post-custom-banner

0개의 댓글