2019. 7. 13. 04:32ㆍ[정리] 기능별 개념 정리/Security + OAuth
* 강의 문서에서는 MVC를 @Controller 가 아닌 MvcConfig 로 구현했다.
* home.html, hello.html, login.html 은 생략한다.
* login.html 은 spring security 가 기본 로그인 login.html 을 제공한다.
* 하지만 이 페이지를 진짜 실무에서 쓰는 일은 없다.
home.html 에서 here 을 클릭 -> 로그인이 됬다 -> hello.html
home.html 에서 here 을 클릭 -> 로그인이 안됬다. -> login.html
@Configuration
public class MvcConfig implements WebMvcConfigurer {
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("home");
registry.addViewController("/home").setViewName("home");
registry.addViewController("/hello").setViewName("hello");
registry.addViewController("/login").setViewName("login");
}
}
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll() // 이 경로는 허용한다
.anyRequest().authenticated() // 나머지 요청은 인증이 필요하다.
.and()
.formLogin()
.loginPage("/login").permitAll() // 이 경로는 로그인 폼이므로 허용한다.
.and()
.logout()
.logoutSuccessUrl("/home")
.permitAll();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("kok202")
.password("123456")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
1. @EnableWebSecurity
이를 쓰는 순간 스프링에서 기본 제공하는 Security 설정을 사용자 정의 설정으로 대체한다
2. configure 메소드
기본적으로 사용자의 모든 요청을 Spring security 가 막는다. 심지어 home.html 에도 못들어간다. 따라서 "http://localhost:8080", "http://localhost:8080/home" 으로 들어오는 경로는 인증이 필요없다고 알려줄 필요가 있다. (* 참고로 css, js 와 같은 코드도 요청이 막히기 때문에 이에 대한 요청도 풀어줘야한다.)
3. userDetailsService 메소드
Spring security 가 관리하는 유저 관리 테이블. 회원 정보를 관리하는 테이블은 회사마다 다르다. user 일수도 있고 member 일수도 있고 account 일 수도 있다. 그 안에 들어가는 정보도 다르다. Spring security 에서 이러한 회사별 니즈를 충족하기 위해서 일반적으로 사용하는 설정들을 담고 추상화한 인터페이스가 UserDetailsService 이다. 개발자는 서버의 유저 관련 정보를 UserDetailsService 으로 변환하는 과정이 필요하다. 이 예제에서는 회원 테이블을 만들지 않는다. 깊이 다루지 않는다.
Flow
1. here 을 클릭한다.
2. localhost:8080/hello 로 가려한다.
3. anyRequest 에 걸리면서 인증이 필요하게된다.
4. Security context 에 Authentication 이라는 객체가 있는지 확인한다.
5. Security context 에 Authentication 이라는 객체가 없으면 인증이 안됬다는 뜻이다.
6. Filter bean 이 이 요청을 가로채서 사용자의 요청을 FormLogin 으로 보낸다.
7. FormLogin 은 /login 을 가리키므로 localhost:8080/login 으로 이동하게된다.
8. kok202, 123456 으로 로그인한다.
9. 유저 이름에 해당하는 유저 정보를 읽어온다.
10. 입력 받은 password 와 유저 정보의 password 가 일치하는지 판단한다.
11. 맞을 경우 Authentication 이라는 객체를 Security context 에 올려준다.
'[정리] 기능별 개념 정리 > Security + OAuth' 카테고리의 다른 글
OAuth 그림 요약 (0) | 2019.08.23 |
---|---|
스프링 시큐리티 주요 인터페이스 (0) | 2019.08.03 |
스프링 시큐리티 개요 (0) | 2019.08.03 |
Security 기초 (2) (0) | 2019.07.13 |
Security OAuth2 강의 정리 (0) | 2019.07.13 |