이번 프로젝트에서 회원 가입 및 로그인을 맡게 되었다.
이번에 내가 쓸 기술을 Spring Security와 Jwt!
이번 프로젝트에서는 회원 가입과 로그인을 담당하게 되었다.
Spring Security 실행과 동시에 그 전에 있던 모든 Http 통신을 막는다. 인증된 사용자에게만 특정 URL에 접근을 허용한다는 것이다.
이 부분에서 내가 고민하고 추구했던 방향은 이번 프로젝의 API들의 Url을 통일성 있게 만들어였겠다는 것이였다.
뭐 하면서 문제는 계속 만났다.
첫번째 문제, Swagger 접속 문제였다. 이 문제의 발생 원인은 securityFiterChain의 설정 때문이였다.
private static final String[] PERMIT_URL_ARRAY = {
"/swagger-ui.html", "/v2/api-docs", "/configuration/ui",
"/configuration/security", "/swagger-resources", "/webjars/**",
"/v2/api/members/create", "/v2/api/members/login","/v2/api-docs","/swagger/**","/swagger-resources/**"
};
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 설정
http.csrf((csrf) -> csrf.disable());
// CORS 설정 추가
http.cors();
// 기본 설정인 SessionController 방식은 사용하지 않고 JWT 방식을 사용하기 위한 설정
http.sessionManagement((sessionManagement) ->
sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.antMatchers(PERMIT_URL_ARRAY).permitAll()
.anyRequest().authenticated() // 그 외 모든 요청 인증처리
);
// 필터 관리
http.addFilterBefore(new JwtFilter(jwtUtil,memberDetailService),UsernamePasswordAuthenticationFilter.class);
return http.build();
}
계속 안되다가, "/swagger-ui.html","/v2/api-docs","/swagger/","/swagger-resources/"
이 정도 추개해주니깐 잘 되었다. 계속 접속이 안되서 뭐가 문제인지 헤맸었는데 이렇게 간단하게 해결되다니 싶다가도, 조금이라도 틀리면서 접속을 허락하지 않는 Security가 오히려 굉장하다 싶었다.
두번째, 사용자 계정이 잠겨져 있습니다.
-_- 서버를 실행시키고 swgger로 로그인을 시켜보니 나오는 저 단어,,,? 이것 때문에도 엄청 헤맸다. 해결 방법은 간단하다.
public class MemberDetailsImpl implements UserDetails {
private final MemberEntity member;
public MemberDetailsImpl(MemberEntity member) {
this.member = member;
}
public MemberEntity getMember() {
return member;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return member.getPassword();
}
@Override
public String getUsername() {
return member.getEmail();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
이 부분에서 false 되있던 것들의 문제였다.이건 뭐냐?
import org.springframework.security.core.userdetails.UserDetails;
이 인터페이스는 Spring Security에서 사용자 정보를 제공하기 위한 기본적인 계약을 정의한 인터페이스이다. 이 인터페이스는 Spring Security의 인증 및 권한 부여 메커니즘을 지원하고 사용자 정보를 제공하는데 필요한 메서드를 정의한다.
UserDetails 인테페이스는 사용자의 주요 정보를 제공하는 메서드이다. 이 정보에는 사용자 이름, 권한 목록,계정 활성화 여부, 계정 만료 여부, 자격 증명 만료 여부, 계정 잠금 여부 등이 포함된다.
사용자 계정이 잠겨 있다고 나온 것은 설정이 false로 되어 있었기 때문이다. 이거는 각 프로젝트의 보안 요구사항에 따라 적합하게 설계하면 된다. 이번 프로젝트 같은 경우에는 보안 요구사항에 대해 깊게 논의한 적이 없었기에 지금은 true 해놓고 쓰되 후에 요구사항에 맞춰 메서드들을 수정할 생각이다.