인프런 커뮤니티 질문&답변

siyeon0209님의 프로필 이미지
siyeon0209

작성한 질문수

Spring Boot JWT Tutorial

Security 설정, Data 설정

/h2-console 403 에러

해결된 질문

작성

·

2.1K

0

@Configuration
public class SecurityConfig {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
                .requestMatchers("/h2-console/**", "/favicon.ico");
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .requestMatchers("/api/hello").permitAll()
                .anyRequest().authenticated()
            .and()
                .headers().frameOptions().disable()
            .and()    
                .csrf().ignoringRequestMatchers("/h2-console/**").disable();
        return http.build();
    }
}

 

http://localhost:8080/h2-consolehttp://localhost:8080/favicon.ico 는 403 에러가 뜨고,

http://localhost:8080/api/hello 는 200 이 떠요.

무슨 문제인지 모르겠습니다 ㅠㅠ

답변 3

1

이렇게 한번 해보세요.

package me.silvernine.jwttutorial.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

//@EnableWebSecurity
@Configuration // 어노테이션 없으면 작동하지 않음
public class SecurityConfig {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
                .requestMatchers("/h2-console/**", "/favicon.ico");
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .requestMatchers("/api/hello").permitAll()
                .and()
                .csrf().ignoringRequestMatchers(new AntPathRequestMatcher("/h2-console/**"))
                .and()
                .headers().frameOptions().disable()
                ;
        return http.build();
    }

}
siyeon0209님의 프로필 이미지
siyeon0209
질문자

답변 감사합니다!

.authorizeRequests()
    .requestMatchers("/api/hello").permitAll()
    .anyRequest().authenticated()  // 나머지 API 는 모두 인증 필요

.anyRequest().authenticated() 가 들어가야 나머지 API들로 접근할 때 인증 제한을 둘 수 있는 걸로 알고 있습니다. 그런데 답변자님의 코드에는 .anyRequest().authenticated() 이 없어서 /h2-console/** 로 접근할 수 있는 것 같아요.

 

강의 코드에서는 .anyRequest().authenticated() 이 있는대도 /h2-console/** 로 접근할 수 있어서, 다음과 같이 바꿔 보았습니다.

@Configuration // 어노테이션 없으면 작동하지 않음
public class SecurityConfig {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
                .requestMatchers("/h2-console/**", "/favicon.ico");
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .requestMatchers("/api/hello").permitAll()
                .anyRequest().authenticated()  // 추가
                .and()
                .csrf().ignoringRequestMatchers(new AntPathRequestMatcher("/h2-console/**"))
                .and()
                .headers().frameOptions().disable()
                ;
        return http.build();
    }

}

이렇게 변경하고 작동하면 또 /h2-console/** 으로 접근이 불가능 하네요 ㅠㅠ

webSecurityCustomizer 문제인 것 같은데 여전히 잘 모르겠습니다.

0

정은구님의 프로필 이미지
정은구
지식공유자

안녕하세요 🙂

Spring Boot 3.4.0 (SNAPSHOT) 버전에 맞춰 샘플 코드를 업데이트했습니다.

아래 링크에서 Java와 Kotlin 버전의 최신 샘플 코드를 확인하실 수 있으니 참고 부탁드립니다.

Javahttps://github.com/SilverNine/spring-boot-jwt-tutorial

Kotlinhttps://github.com/SilverNine/spring-boot-jwt-tutorial-kotlin

0

@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.ignoring()
            .requestMatchers(new AntPathRequestMatcher("/h2-console/**"))
            .requestMatchers(new AntPathRequestMatcher("/favicon.ico"));
}

이렇게 작성하면 잘 동작합니다!

siyeon0209님의 프로필 이미지
siyeon0209

작성한 질문수

질문하기