ToBe끝판왕

[ 스프링 시큐리티 ] 스프링 시큐리티 View 렌더링 문제 본문

■ 공부 기록/삽질 해결

[ 스프링 시큐리티 ] 스프링 시큐리티 View 렌더링 문제

업그레이드중 2024. 12. 16. 18:37
반응형

 

 


 

 

스프링 시큐리티 설정파일 View 렌더링 설정

 

 

• Spring Security 설정 파일

-  스프링 부트 3.x 이상 버전

-  스프링 시큐리티 5.7 이상 버전

-  기존 회원가입 페이지 url 허용함

 

 

• 회원가입 URL 입력시 문제 발생 ( 페이지 보이지 X )

 

-  현재 로그를 보면, Spring Security 가 /WEB-INF/views/member/joinForm.jsp 경로에 대해 인증이 필요하다고 판단함

-  Security Filter 에 의해 권한이 없다고 결론내리고 /user/login 페이지로 리다이렉트 되고 있다.

 

 

• JSP 파일의 경로가 필터에 걸려 노출되지 않는 현상 발생

-  forwards / includes 타입 요청을 필터에서 허용하도록 수정 필요

-  .jsp 파일 경로 ( WEB-INF/view/* ) 허용하도록 수정 필요

package com.wsd.invest.security;

import jakarta.servlet.DispatcherType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
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.WebSecurityCustomizer;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.firewall.DefaultHttpFirewall;
import org.springframework.security.web.firewall.HttpFirewall;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // 회원 정보 조회 Service 클래스 주입
    private UserDetailService userDetailService;

    private PasswordEncoder passwordEncoder;

    @Autowired
    public SecurityConfig(UserDetailService userDetailService, PasswordEncoder passwordEncoder) {
        this.userDetailService = userDetailService;
        this.passwordEncoder = passwordEncoder;
    }

    // AuthenticationManager 빈 등록
    @Bean
    public AuthenticationManager authenticationManager(
            AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.httpFirewall(defaultHttpFirewall());
    }

    @Bean
    public HttpFirewall defaultHttpFirewall() {
        return new DefaultHttpFirewall();
    }

    // HTTP 요청에 따른 보안정책 정의 (스프링 시큐리티 버전 5.7 이상 버전 방식 )
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http
                // CSRF 비활성화 (필요시 활성화 가능)
                .csrf(csrf -> csrf.disable())

                // 권한에 따른 HTTP url 설정
                .authorizeHttpRequests(auth -> auth
                        // 메인 / 로그인 / 회원가입 / .jsp 파일 경로 접근 허용
                        .requestMatchers("/user/main", "/user/login", "/user/join", "/WEB-INF/views/**").permitAll()
                        // 정적 리소스 허용
                        .requestMatchers("/css/**", "/js/**", "/images/**").permitAll()
                        // forward / include 타입 요청 허용
                        .dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll()
                        .dispatcherTypeMatchers(DispatcherType.INCLUDE).permitAll()
                        // 나머지 요청 인증 필요
                        .anyRequest().authenticated()
                )

                // 로그인 설정
                .formLogin(form -> form
                        // Get 요청 로그인 페이지
                        .loginPage("/user/login")
                        // Post 요청 로그인 처리 Url
                        .loginProcessingUrl("/user/login")
                        // 로그인 성공 url
                        .defaultSuccessUrl("/user/main", true)
                        // 로그인 실패 url
                        .failureUrl("/user/login?error=true")
                        .permitAll()
                )

                // 로그아웃 설정
                .logout(logout -> logout
                        // POST 요청 로그아웃 처리 Url
                        .logoutUrl("/user/logout")
                        // 로그아웃 성공 url
                        .logoutSuccessUrl("/user/login")
                        // 로그아웃 시 세션쿠키 삭제
                        .deleteCookies("JSESSIONID")
                        .permitAll()
                )

                .requestCache(requestCache -> requestCache.disable());

                return http.build();
    }

}

 

 

 

 

※  The Request was rejected because the URL contained a potentially malicious string "//" 발생

-  URL 에 문자열 "//" 이 포함되어 요청이 거부되는 에러 발생

-  Spring Security Config 에 밑에 내용을 추가한다.

-  더블 슬래시 허용 코드를 추가함으로써 해결

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.httpFirewall(defaultHttpFirewall());
    }

    @Bean
    public HttpFirewall defaultHttpFirewall() {
        return new DefaultHttpFirewall();
    }
반응형
Comments