= Cross-Site Request Forgery
웹 애플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 해서 특정 웹 페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법
공격자가 해당 사이트의 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 요청을 하면 다시 토큰을 받아 이전에 보냈던 토큰과 일치하는 지 확인한다.
이를 통해 사용자는 항상 자신이 의도한 요청만 할 수 있게 된다.
스프링 시큐리티는 기본적으로 csrf 토큰을 전달해서 공격을 방어한다.
그래서 처음 스프링 시큐리티를 배울 때 이 옵션을 disable하라고 한다. 왜냐하면 추가적으로 해야할 일이 생기기 때문이다.
http
.csrf((auth) -> auth.disable());
(config 클래스에서 해당 코드를 작성하면 csrf 옵션이 비활성화된다.)
모든 폼 타입의 요청에서 csrf 토큰 코드를 작성하지 않으면 요청이 받아들여지지 않는다.
따라서 초보자는 처음 배울 때 해당 옵션을 비활성화 하고 나중에 숙련이 되면 코드를 추가하는 식으로 csrf 설정을 하게된다.