스프링 시큐리티의 대부분의 설정을 담당하는 HttpSecurity 객체에 대해
정리해보려고 합니다.
하면서 뭔가 두리뭉실하게 알고 있는 설정들에 대해서
결국은 제대로 된 개념을 아는 것이 맞는거 같아 정리해보려고 합니다.
특정 리소소의 접근 허용 또는 특정 권한을 가진 사용자만 접근을 가능하게 설정
@Override
protected void configure(HttpSecurity http) throws Exception{
// 스프링 필터 순서를 알아야 한다.
http.csrf().disable();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(corsFilter) // @CrossOring은 인증이 없을 때 인증이 있을 때는 시큐리티 필터에 등록
.formLogin().disable()//formLogin() : Spring Security에서 제공하는 인증방식
.httpBasic().disable()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))//AuthenticationManager
.addFilter(new JwtAuthorizationFilter(authenticationManager(),userRepository))
.authorizeRequests()
.antMatchers("/api/v1/user/**")
.access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
.antMatchers("/api/v1/manager/**")
.access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
.antMatchers("/api/v1/admin/**")
.access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll();
}
authorizeRequests
시큐리티 처리에 HttpServletRequest를 이용한다는 것을 의미합니다.
antMatchers
특정 리소스에 대해서 권한을 설정합니다.
permitAll
antMatchers로 설정한 리소스의 접근을 인증절차 없이 허용한다는 뜻입니다.
anyRequest
모든 리소스를 의미하며 접근허용 리소스 및 인증 후 특정 레벨의 권한을 가진 사용자만 접근가능한 리소스를 설정한 후에 사용합니다.
그 외 나머지 리소스들에 대한 접근 허용 수준을 결정할 때 사용합니다.
아래 코드는 그 외 나머지 리소스들은 무조건 인증을 완료해야 접근이 가능하다는 의미입니다.
anyRequest().authenticated()
http.formLogin()
form 태그 기반의 로그인을 지원하겠다는 설정입니다.
이를 이용하면 별도의 로그인 페이지를 제작하지 않아도 됩니다.
'/login' 경로를 호출하면 스프링 시큐리티에서 제공하는 기본 로그인 화면을 볼 수 있게 됩니다.
loginPage
사용자가 따로 만든 로그인 페이지를 사용하려고 할때 설정합니다.
따로 설정하지 않으면 디폴트 URL이 “/login”이기 때문에 “/login”로 호출하면 스프링이 제공하는 기본 로그인페이지가 호출됩니다.
loginProcessingUrl
사용자 이름과 암호를 제출할 URL
defaultSuccessUrl () – 성공적인 로그인 후 랜딩 페이지
failureUrl () – 로그인 실패 후 방문 페이지
logoutUrl () – 사용자 정의 로그 아웃
httpBasic()
쿠키의 기본 정책 "동일 도메인에서 가능하다"
자바스크립트에서 요청하면 쿠키가 안날라가서
강제로 자바스크립트에서 쿠키를 만들어서 요청할 수 있습니다.
그러나 대부분의 요즘 서버는 쿠키를 http only로 해서 쿠키를 건들지 못하도록 합니다.
fetch("http://www.naver.com", {
header:{
Cookie:""
}
})
만약에 서버가 쿠키를 http only를 false로 한다면 자바 스크립트로 장난을 칩니다.
그래서 어떤 방식이 있냐면
header의 Anthorization 키 값에 id,pw를 달고 가는 방식이 있습니다.
http basic 방식이 입니다.
이 방식은 session을 만들지 않아 서버의 확장성은 좋습니다.
하지만 id,pw가 암호화가 되지 않아 개인정보가 노출됩니다.
이를 노출되지 않도록 https서버를 사용하면 됩니다. 그러면 id,pw가 암호화가 됩니다.
우리가 배우는 방식은
Anthorization에 토큰을 달고 가는 방식입니다.
토큰이 id와 pw가 아니기 때문에 안전하고 이 방식을 Bearer Token이라고 합니다.
https://recordsoflife.tistory.com/248
https://devidea.tistory.com/8