Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

JAN's History

CSRF Token의 개념과 공격 본문

JWT

CSRF Token의 개념과 공격

JANNNNNN 2024. 6. 8. 12:26

CSRF 공격 개념

크로스 사이트 요청 위조(Cross-Site Request Forgery, CSRF)는 사용자의 의지와 무관하게 공격자가 의도한 특정 요청을 서버로 보내도록 하는 웹 보안 공격입니다. 이는 사용자가 정상적으로 로그인을 하고 권한을 획득한 상태에서 발생합니다. 공격자는 사용자를 속여 피싱 사이트에 접속하게 하고, 해당 사이트에서 사용자로 하여금 변조된 요청을 서버로 보내도록 합니다. 이를 통해 공격자는 사용자의 권한을 악용하여 서버에 비정상적인 요청을 보낼 수 있습니다.

CSRF 공격 예시

여기 간단한 예시로 이해해보겠습니다:

  1. 상황: 사용자가 "인스타그램"이라는 웹사이트에 로그인을 했습니다. 이 웹사이트에서는 사진을 업로드할 수 있습니다.
  2. 공격자: 공격자는 피싱 사이트를 만들어 사용자가 이 사이트에 접속하게 유도합니다. 피싱 사이트의 URL은 원래 사이트와 매우 유사하게 설정됩니다. 예를 들어, 원래 사이트가 naver.com이라면 피싱 사이트는 never.com과 같이 비슷하게 설정됩니다.
  3. 사용자 행동: 사용자는 피싱 사이트에 접속하게 되고, 이 사이트에서 사진을 업로드하려고 합니다. 사용자는 "반갑습니다"라는 제목으로 사진을 업로드하려고 하지만, 실제로는 공격자가 숨겨둔 폼 필드에 의해 "돈 쉽게 벌 수 있는 방법 .."라는 제목의 게시물이 업로드됩니다.
  4. 결과: 사용자의 권한을 이용해 공격자가 의도한 내용이 서버에 전달되고 게시물이 업로드됩니다.

CSRF 방어: CSRF 토큰 개념 설명

CSRF 공격을 방어하는 방법 중 하나는 CSRF 토큰을 사용하는 것입니다. CSRF 토큰은 서버측 애플리케이션에서 생성되고 클라이언트와 공유되는 인증 값입니다. 클라이언트는 서버의 통신에 올바른 CSRF 토큰을 포함해야합니다.

CSRF 토큰은 서버가 사용자에게 발행하고, 사용자 폼에 포함되어 서버로 전송되는 고유한 토큰입니다. 이를 통해 서버는 요청이 올바른 출처에서 온 것인지 확인할 수 있습니다.

 

  1. 클라이언트는 HTTP GET 메서드를 이용해 애플리케이션 서버에 액세스한다.
  2. 서버는 CSRF 토큰을 생성하고 HTTP 세션에 저장한다. 생성된 CSRF토큰은 HTML형식에 숨겨진 태그를 사용해 클라이언트와 연결된다.
  3. 클라이언트는 HTML양식의 버튼을 클릭해 애플리케이션 서버에 요청을 보낸다. CSRF토큰은 HTML형식의 숨겨진 필드에 포함되어 있으므로 CSRF 토큰 값이 요청 매개 변수로 전송된다.
  4. 서버는 요청 파라미터에 젖아된 CSRF 토큰 값과 HTTP POST 메소드를 이용해 액세스할 때 HTTP 세션에 유지된 CSRF 토큰값이 동일한지 확인한다. 토큰 값이 일치하지 않으면 잘못된 요청으로 오류가 발생한다.

코드 예시: 스프링 시큐리티에서 CSRF 토큰 사용

1. 스프링 시큐리티 설정

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().and() // CSRF 보호 활성화
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}

2. HTML 폼에서 CSRF 토큰 포함

<form action="/upload" method="post">
    <input type="hidden" name="_csrf" value="${_csrf.token}" />
    <input type="text" name="title" placeholder="Enter title">
    <input type="file" name="file">
    <button type="submit">Upload</button>
</form>

요약

CSRF 공격은 사용자의 권한을 악용하여 서버에 변조된 요청을 보내는 방식입니다. 이를 방어하기 위해 CSRF 토큰을 사용하여 서버가 요청의 출처를 검증합니다. 스프링 시큐리티에서는 CSRF 토큰을 쉽게 발행하고 검증할 수 있도록 도와주며, 이를 통해 애플리케이션의 보안을 강화할 수 있습니다.