Spring/Spring 기본 도구 복습

02-05 til 최신 버전 Spring 3.2.2 사용 할때 주의점. + Spring security 조금

sehunbang 2024. 2. 5. 20:32

보통 pathvariable 하면 이렇게 하는데.

@PutMapping("/schedule/{id}")
public Long updateSchedule(@PathVariable Long id, @RequestBody ScheduleRequestDto requestDto,@AuthenticationPrincipal UserDetailsImpl userDetails) {
    return service.updateSchedule(id,requestDto,userDetails.getUser());
}

 

 

이렇게 하면 이상한 에러가 (그것도 엄청 많이)뜹니다.

 

그 이유는 id 값을 찾을 수 없다면서 입니다.....

 

(name = "id") 로 값으 지정해 주어야 알아 뭘 가져 와야 하는 지 이해 합니다..

@PutMapping("/schedule/{id}")
public Long updateSchedule(@PathVariable(name = "id") Long id, @RequestBody ScheduleRequestDto requestDto,@AuthenticationPrincipal UserDetailsImpl userDetails) {
    return service.updateSchedule(id,requestDto,userDetails.getUser());
}

 

 

///

 

Spring security 조금

복습:

 

 

CSRF Attacks(Cross-Site Request Forgery) 이란? 

 

사이트 간 요청 위조.

 

사용자가 인증된 상태로 (인증 세션이 이미 시작 되었으면) 

웹 애플리케이션에 접근할 때 희생자의 권한을 이용하여 악의적인 요청을 전송합니다.

 

  1. 피해자 가 웹 애플리케이션에 로그인: 희생자가 웹 에 로그인하고 세션을 시작.
  2. 공격자가 악의적인 페이지 생성: 공격자는 피해자 에게 유혹적인 링크를 포함한 악성 웹 페이지를 제작. 이 페이지는 특정 액션을 수행하는 요청을 포함.
  3. 피해자악성 페이지 방문: 희생자는 악성 페이지를 방문하며, 이로 인해 악성 요청이 자동으로 희생자의 브라우저에서 실행
  4. 피해자 권한으로 악의적인 요청 실행: 희생자가 로그인한 상태이기 때문에 브라우저는 희생자의 권한으로 악성 요청을 실행.

 

인증(Authentication)과 권한 부여(Authorization)를 관리하며, 다양한 공격에 대한 방어 메커니즘도 제공

(알다 시피 Spring Security는 Spring 기반의 애플리케이션에서 보안을 구현하기 위한 강력한 프레임워크)

Spring Security는 기본적으로 모든 POST 요청에 대해 CSRF 토큰을 생성하고 검증하도록 설정 되어 있다.

 

1. CSRF 토큰 생성 및 삽입: Spring Security는 웹 애플리케이션에서 폼(form)을 사용할 때 자동으로 CSRF 토큰을 생성하고 해당 토큰을 폼에 삽입 (사용자가 애플리케이션을 통해 데이터를 전송할 때 해당 토큰이 같이 전송).

 

2. CSRF 토큰 검증: 서버는 클라이언트로부터 받은 POST 요청에 포함된 CSRF 토큰을 검증합니다. 이때, Spring Security는 기본적으로 요청 헤더(X-CSRF-TOKEN)나 요청 매개변수(_csrf) 중 어느 하나에 토큰을 포함하도록 구성함.

 

//
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                // 다른 설정...

                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .and()
        // 다른 설정...
    }
}

 

 

csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())는 CSRF 토큰을 쿠키에 저장하고 

클라이언트에서 접근할 수 있도록 설정합니다.

 

 withHttpOnlyFalse()를 사용하면 JavaScript에서도 토큰에 접근 가능합니다.