Wanna be Brilliant Full-Stack Developer

SpringBoot 로그인1 UserDetailsService 본문

Back-End/Spring Boot

SpringBoot 로그인1 UserDetailsService

Flashpacker 2022. 2. 10. 16:55

Post는 Insert할떄 쓰이는건데 로그인은 Insert 하는것이 아니라 데이터베이스 안에 username과 password와 있는지 셀렉트해서 확인하는것이 아닌지 물어볼수있다.

원래는 Selecet 할때는 get을 써야한다. 

 

하지만 로그인 할때는 Post를 사용한다!

왜냐하면 유저네임과 패스워드는 귀중한 에너지인데 주소창에 노출할수 없다. 데이터를 바디에 안고 들어가려면 post방식 밖에 없다. 그래서 예외적으로 로그인만 POST 로 하면된다! 

 

이 로그인 과정을 우리가 제어하는 것이 아니라 Spring Security 한테 위임해야한다! 

회원가입에서는 우리가컨트롤러를 만들었는데 (AuthController.java) 로그인에 관한 컨트롤러는 우리가 만들지 않는다

 

(SecuirtyConfig.java)

package com.cos.photogramstart.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.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.FormLoginBeanDefinitionParser;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity		//해당 파일로 시큐리티를 활성하
@Configuration // IoC      
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Bean
	public BCryptPasswordEncoder encode() {
		return new BCryptPasswordEncoder();
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		// super 삭제 - 기존 시큐리티가 가지고 있는 기능이 다 비활성화됨.
		http.csrf().disable();
		http.authorizeRequests()
			.antMatchers("/", "/user/**","/image/**","/subscribe/**","/comment/**").authenticated()
			.anyRequest().permitAll()
			.and()
			.formLogin()
			.loginPage("/auth/signin")	//GET
			.loginProcessingUrl("/auth/signin") //POST
			.defaultSuccessUrl("/");
		
	}
}

1) 어떠한 인증이 필요한 페이지를 요청하면 Get방식으로 시큐리티컨피그가 loginPage를 호출할것이고 

2) 누군가가 로그인 Post요청을 하면 loginProcessingUrl

 

정리:  누군가가 /user/**를 요청하면 .authenticated()를 통해 인증이 필요한 페이지인데 인증이 안되어있으면 /auth/signin을 던져주고 누군가가 /auth/signin  주소로 로그인 요청을 하면 Security가 낚아 채서 로그인 프로세스(loginProcessingUrl) 를 진행한다 

 

/auth/signin 이라는 요청이 들어오면 시큐리티 설정파일이 로그인 요청이라는것을 알아채서 원래는 UserDetailsService 가 낚아 챈다.

하지만 서버안에 있는 시큐리티 설정 파일이 post:/auth/signin 요청을 받게되면 로그인 요청을 하는쪽에서는 Http Body 안에 username 과 password 를 들고오는것을 받고 바깥으로 보내는순간 

IOC 컨테이너에 UserDetailsService가 메모리에 떠있는것을 받고 

PrincipalDetailsService가 IOC가 되고 집어넣으려고 보니까 UserDetailsService와 부모 타입이 같으니까 같으면 userDetailsService를 없애고 덮어버린다. 

IOC에 PrincipalDetailsService에서 로그인이 진행된다. 

 

서버에서 시큐리티 설정파일은 Post: /auth/signin 신호가 오기를 주시하고 있다. 
IOC가 UserDetailsService를 메모리에 띄어놓고 로그인 진행을 하기위해 이동한다
PrincipalDetailsService가 UserDetailsService를 덮어서 없애고 로그인을 진행한다. 

'Back-End > Spring Boot' 카테고리의 다른 글

SpringBoot 로그인 View  (0) 2022.02.11
SpringBoot 로그인 2  (0) 2022.02.11
SpringBoot 공통응답 Script 만들기!  (0) 2022.02.10
SpringBoot 공통 응답 DTO 만들기  (0) 2022.02.10
SpringBoot 글로벌 예외 처리하기  (0) 2022.02.10