개발 공부 기록

[Postman/Spring Security] 403 Forbidden 에러 본문

Spring/Trouble Shooting

[Postman/Spring Security] 403 Forbidden 에러

나만없서고냥이 2023. 11. 30. 15:58

🚨 문제 발생

간단히 구현한 회원가입 로직을 테스트하기 위해 Postman을 이용하였습니다. 이때 제가 보낸 Post 요청에서 403 Forbidden 에러가 발생하였습니다.

 

💡 문제 원인

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
            .csrf(AbstractHttpConfigurer::disable)
            .cors(AbstractHttpConfigurer::disable)
            .sessionManagement(httpSecuritySessionManagementConfigurer -> {
                httpSecuritySessionManagementConfigurer
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
            })
            .authorizeHttpRequests((authorizeRequests) -> authorizeRequests
                    .requestMatchers("/signup").permitAll()
                    .anyRequest().authenticated()
            )
            .build();
    }

 

위는 SecurotyConfig의 일부분입니다. 403 에러에 관련해서 구글링을 했는데 대부분 csrf 설정을 disable해서 에러를 방지하였습니다. 하지만 저는 이미 csrf 설정을 disable 해놓은 상태였으므로, 요청에 대한 인가 규칙을 다시 설정하였습니다.

 

🔨 문제 해결

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
            .csrf(AbstractHttpConfigurer::disable)
            .cors(AbstractHttpConfigurer::disable)
            .sessionManagement(httpSecuritySessionManagementConfigurer -> {
                httpSecuritySessionManagementConfigurer
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
            })
            .authorizeHttpRequests((requests) -> requests
                    .requestMatchers("/api/user/**").hasRole("USER")
                    .requestMatchers("/api/admin/**").hasRole("ADMIN")
                    .anyRequest().permitAll()
            )
            .build();
    }

 

기존 코드에서도 회원가입은 모든 사용자에게 허용하기 위해 누구나 /signup 경로에 대한 요청을 할 수 있도록 하였습니다. 이번에는 /api/user/**/api/admin/**에 대해서만 역할 기반의 권한 검사를 하고, 나머지 요청은 permitAll()로 모든 요청을 허용하도록 하는 방식으로 수정하였더니 403 에러가 발생하지 않았습니다.

 

결국 두 코드의 전반적인 동작은 유사하지만, 약간의 차이가 있습니다.

기존 코드에서는 .anyRequest().authenticated()로 설정하여 /signup을 제외한 모든 요청을 인증된 사용자만 허용하는 규칙을 적용했습니다. 그러나 수정한 코드에서는 .anyRequest().permitAll()로 설정하여 특정 요청을 제외한 모든 요청을 인증 없이 허용하는 규칙을 적용했습니다.

 

즉 기존 코드에서는 인증되지 않은 사용자를 제한하는 반면, 수정한 코드에서는 모든 요청을 허용(인증과 관련없이 허용)하고 있기 때문에 403 Forbidden 에러가 발생하지 않았습니다.