아 정말 spring공부하면서 가장 어려웠던 부분이라고 생각한다.. Ytube도 봐보고 google 서칭도 해보면서, 얼추 개념확립만 한 상태로
블로깅을 해보려고 한다.
spring boot를 통해 프로젝트를 구현할 때 회원을 등록하는 코드도 있고, 데이터 베이스를 통해서 회원의 정보를 가져오는 코드를 만드는 경우가 있다. 하지만 보통 프로젝트라면 정해진 기능이 있을 것이고, 관리자와 사용자등 역할이 나눠져 있을 것이다. 그래서 각각 회원마다 인가--> 역할을 정해주는 것과, 회원이 맞는지 인증하는 로그인 기능이 필요함을 느꼈다.
이를 대신 해주는 것이 spring security이다.
implementation 'org.springframework.boot:spring-boot-starter-security'
gradle을 이용할 경우 이 한줄이 spring security에 대한 의존성을 나타낸다.
import org.springframework.context.annotation.Configuration;
@Configuration
public class SecurityConfiguration {
}
그리고 spring security에 대한 설정은 SecurityConfiguration을 통해서 진행하게 된다.
google서칭을통해서 문서들을 보다보면 WebSecurityConfigurerAdapter를 상속하는 형태의 방법을 많이 사용했지만,
Spring security 5.7버전 부터는 사용하지 않음을 알게 되었다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.formLogin()
.loginPage("/auths/login-form")
.loginProcessingUrl("/process_login")
.failureUrl("/auths/login-form?error")
.and()
.logout() // (1)
.logoutUrl("/logout") // (2)
.logoutSuccessUrl("/") // (3)
.and()
.exceptionHandling().accessDeniedPage("/auths/access-denied")
.and()
.authorizeHttpRequests(authorize -> authorize
.antMatchers("/orders/**").hasRole("ADMIN")
.antMatchers("/members/my-page").hasRole("USER")
.antMatchers("⁄**").permitAll()
);
return http.build();
}
보통 http의 대한 설정은 이렇게하는데 설명하자면 간단하다.
csrf공격에 대해서 방지할 것인가 에대한 것이고, 현재 localhost로 개발을 하기 때문에 필요가없다.
그리고 CSR방식으로 개발할 때는 formLogin에 대한 설정도 필요없다. 주로 JWT토큰을 사용해서 설정하게 된다.
그리고 audhorize부터는 역할에 대한 인가설정이다. 엔드포인트마다 어떤 역할을 가진 사람들을 허가해 줄지 설정해주는 코드이다.
private final PasswordEncoder passwordEncoder;
PasswordEncoder도 security설정에 넣어서 회원가입시 passwordEncoder를 통해서 변경해서 넣어주어야 보안이 된다.
자 그래서 Spring Security가 대체 뭘하는거고, 어떻게 작동하는지 이해가 정말 안갔다.
하지만 내가 이해한것으로는
1. 역할을 정해주는 AuthorityUtil을 구현해야한다.
어떤 역할이 있고, 이메일이나 어떤 특정한 속성으로 역할을 정해줄 지 기준을 정하고, 역할을 정해주는 utils를 구현해야한다.
2.UserDetailsSerivce를 상속받은 유저디테일서비스를 구현해야한다. loadUserByUserName을 오버라이드하고, 실제 로그인을 할떄 역할과 사용자의 정보에 대한것을 어떻게 가져올지 설정을 해야줘야한다.
3.그리고 UserDetails를 상속받은 객체를 생성해서 UserDetails를 넘겨주면 일단 Spring Security의 기본적인 설정이 끝이난다.
@ElementCollection(fetch = FetchType.EAGER)
private List<String> roles = new ArrayList<>();
속성에다가 Role을 추가해줘서 회원가입시에 같이 넣어줘야한다. 그래야 spring security를 통해서 인증하는 것이 가능해진다.
다음은 간단한 인증의 절차에 대해서 알아보고, 그 뒤엔 JWT토근에 대해서 정리해보곘다.
'부트캠프 > 코트스테이츠 백엔드 코스' 카테고리의 다른 글
70일차 회고 (0) | 2023.06.08 |
---|---|
52일차 회고 (0) | 2023.05.29 |
46~50 (0) | 2023.05.18 |
40 회고 (0) | 2023.05.08 |
37(테스팅과 API document작성) (0) | 2023.05.05 |