이전 글에서는 Spring Security를 간단하게 사용해보았습니다.

하지만 매번 csrf 토큰을 확인해줘야 하는 문제와 사용자의 패스워드가 그대로 노출되는 문제가 있었습니다.

개발 환경

  • Spring Boot 3.2.4
  • spring-boot-starter-security
  • spring-boot-starter-oauth2-resource-server

config/security/SecurityConfig.java

...
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http

            // CORS CSRF 미사용처리
            .cors(AbstractHttpConfigurer::disable)
            .csrf(AbstractHttpConfigurer::disable)

            // 인증 활성화
            .authorizeHttpRequests(auth -> auth
                    .anyRequest().authenticated())

            // Form Login 활성화
            .formLogin(Customizer.withDefaults())
            
            // 동일도메인 iframe 접근 활성화
            .headers(header -> header
                    .frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
            )

            .build();
}
...

 

CORS와 CSRF를 비활성화 처리를 했습니다

FilterChain을 새롭게 구성하면 인증과 Form Login 활성화가 필요합니다.

동일 도메인 iframe 접근 활성화 주석된 부분을 포함하지 않고 h2-console에 접속하면

로그인 페이지는 보이겠지만 로그인을 성공하면 아래 페이지처럼 보일것입니다

 

위 처럼 뜨는 이유는 h2-console이 iframe을 사용하는데

spring security는 Clickjacking 공격을 막기위해 기본적으로 비활성화되어 있다고 합니다

https://stackoverflow.com/a/28649205

 

How to disable 'X-Frame-Options' response header in Spring Security?

I have CKeditor on my JSP and whenever I upload something, the following error pops out: Refused to display 'http://localhost:8080/xxx/xxx/upload-image?CKEditor=text&CKEditorFuncNum=1&lang...

stackoverflow.com

 

위 까지만 설정을 하고 브라우저를 통해 테스트를 하면 정상적으로 동작하는 것을 확인할 수 있습니다.

 

POSTMAN으로 테스트 하실때는

먼저 아래 사진처럼 POST 요청으로 로그인을 진행해주세요 

 

그리고 나서 다른 API를 테스트 하시면 정상적으로 동작할겁니다.

POSTMAN도 내부적으로 쿠키를 관리하고 있어서

로그인 요청시 Header 에 JSESSIONID 정보를 담아서 전송하고

로그인이 성공하면 이후의 API 요청은 정상적으로 처리됩니다

주의: 부정확함. securityFilter 빈을 별도로 등록하면 기본값으로 세션인증방식으로 처리되는 것 같습니다.

 

다음글에서는 JWT 를 이용한 인증을 해보겠습니다

+ Recent posts