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

망고123님의 프로필 이미지

작성한 질문수

코드로 배우는 React with 스프링부트 API서버

DTO와 인증 서비스

/api/member/login 404 에러 질문 드립니다.

해결된 질문

작성

·

424

0

시큐리티까지 강의를 듣고 혼자 실습 예제 만들어서 회원가입부터 진행하고 있습니다. 강의 따라서 진행할 때에는 잘 됐는데, 지금은 섹션6 시큐리티 부터 따라했는데 /api/member/login 으로 포스트맨이나 웹 브라우저로 접속하면 해당 경로를 찾을 수 없다는 404 에러가 발생하게 됐습니다. ㅠㅠ

 http.formLogin(config -> config.loginPage("/api/member/login"));

강의 따라 진행할 때에도 /api/member/login 컨트롤러는 별도로 없었는데, 지금 왜 갑자기 에러가 발생하는지 궁금합니다 ㅜㅜ

답변 5

0

망고123님의 프로필 이미지
망고123
질문자

문제 해결 됐습니다! 강의에서 말씀해주시는 것처럼 log 를 통해서 해당 인증에 접근이 성공한다면 저처럼 실습 내용과 약간 다르더라도, 인증 성공/실패 핸들러까지 구현된다면 정상적으로 모두 잘 출력됩니다 ㅎㅎ
왜 안됐는지 정확한 원인은 못 찾았습니다. 하지만 log 를 통해서 각 인증에 접근하고 출력된 결과를 통해서 정상적으로 동작된 것은 확인되고, 계속 강의 진도 나가시면 포스트맨에서 회원 정보도 정상적으로 출력됩니다!

바쁘실텐데 끝까지 해결해주기 위해서 도와주셔서 정말 감사합니다! ㅠㅠㅠ 계속 도와주셔서 정상적인 실행까지 볼 수 있었습니다. 감사합니다!

0

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

아.. 우선은 인증처리해주는 UserDetailsService구현체가 없어서 그렇고..

 

화면이 안나오는 문제는 config.loginProcessingUrl("/api/member/login") 하시고 POST 전송해 보시면 될 겁니다.

 

 

 

화면이 안 나오는 건 인증처리가 안되서 error메시지를 보여주기 위한 화면을 찾아서 그렇습니다.

 

 

망고123님의 프로필 이미지
망고123
질문자

다행 포스트맨에서는 Status 200 OK 으로 정상이지만 자격 증명 에러가 발생하고 있습니다. 브라우저로 들어가면 동일한 에러는 발생하고 있습니다 ㅜㅜ

 

org.springframework.security.authentication.BadCredentialsException: 자격 증명에 실패하였습니다.

imageimageimage

0

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

음..

아래 링크에 프로젝트를 좀 올려주시거나..

깃헙 링크를 cookie_00@naver.com으로 한번 보내봐 주세요

 

https://drive.google.com/drive/folders/1ZLHRKaXx8Ou8kZNd1WE6qALxq_wJODXW?usp=drive_link

 

 

망고123님의 프로필 이미지
망고123
질문자

구글 드라이브로 올려드렸습니다. 감사합니다! ㅠㅠ

0

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

"org.springframework.web.servlet.resource.NoResourceFoundException

가 발생했다고 하더라고 .. 서버 내부에서는

 

BadCridentialException 이 발생하지 않았나요?

 

 

org.springframework.security.authentication.BadCredentialsException: 자격 증명에 실패하였습니다.

 

 

정상적인 상황이라면 BadCredentialException이 발생해서 에러 메시지를 로그인 화면으로 가려고 해서 위의 에러가 발생할 수는 있습니다만..

 

 

망고123님의 프로필 이미지
망고123
질문자

image
서버 내부에서 에러 메시지는 발생되지 않는 상태입니다. 새로운 프로젝트 생성해서 해봤는데 아무래도 해당 프로젝트가 문제인 것 같기도 합니다... 새로운 프로젝트에서는 정상적으로 강의랑 동일하게 되고 있습니다. 지금 문제 발생된 해당 프로젝트에서 원인은 끝내 찾지 못했습니다 ㅜㅜ

0

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

api/member/login은 시큐리티에서 로그인을 처리하는 경로로 지정된 것이라..

컨트롤러를 만드는 것이 아니고.. 시큐리티가 제공하는 로그인 화면의 경로입니다.

프로젝트 실행후에 GET방식으로 'api/member/login' 호출해 보시면 기본적으로 제공하는 로그인 화면이 뜨지 않나요?

 

POST방식 호출 전에 반드시 CSRF 설정은 disable로 지정되어야 합니다.

 

 

 

망고123님의 프로필 이미지
망고123
질문자

package com.fastcampus.aptner.auth.config;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import java.util.List;

@Log4j2
@RequiredArgsConstructor
@EnableMethodSecurity
@Configuration
public class CustomSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        log.info("------------------ security config activate ------------------------");

        
        // 세션 사용 금지
        http.sessionManagement(httpSecuritySessionManagementConfigurer ->
                httpSecuritySessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.NEVER));

        // cors 설정
        http.cors(httpSecurityCorsConfigurer ->
                httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource()));

        // csrf 비활성화
        http.csrf(httpSecurityCsrfConfigurer -> httpSecurityCsrfConfigurer.disable());

        // 로그인 지정
        http.formLogin(config -> config.loginPage("/api/member/login"));

        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


    @Bean
    public CorsConfigurationSource corsConfigurationSource() {

        CorsConfiguration corsConfiguration = new CorsConfiguration();

        corsConfiguration.setAllowedOriginPatterns(List.of("*")); // 어디서든 허락
        corsConfiguration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS"));
        corsConfiguration.setAllowedHeaders(List.of("Authorization", "Cache-Control", "Content-Type"));
        corsConfiguration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration);

        return source;
    }
}


CustomSecurityConfig 클래스 안에 답변 주신 것처럼 csrf 또 disable() 으로 설정되어 있습니다. 그리고 DB 안에 회원 정보들도 저장된 상태입니다. 제가 잘못한 부분이 있을까요..?

포스트맨, 웹 브라우저 접속 보면은 아래처럼 /api/member/login 경로를 찾을 수 없다는 404 에러 발생하고 있습니다...


imageimage