- [springSecurity]스프링 시큐리티 목차
@EnableWebSecurity
-@Configration 클래스에 @EnableWebSecurity 어노테이션을 추가하여 SpringSecurity 설정할 클래스라고 정의한다.
설정은 WebSecurityConfigurer인스 클래스를 상속받아메서드를 구현하는 것이 일반적인 방법이다.
WebSecurityConfigureer 클래스
-WebSecurityConfigurer 인스턴스를 편리하게 생성하기 위한 클래스이다.
passwordEncoder()
- BCryptPasswordEncoder는 SpringSecurity에서 제공하는 비밀번호 암호화 객체이다.
Service에서 비밀번호를 암호화할 수 있도록 Bean으로 등록한다.
configure()메서드를 오버라이딩하여 Secuity 서렁을 잡아준다.
configure(WebSecurty web)
- WebSecurity는filterChainProxy를 생성하는 필터입니다.
web.ignoring().antMatchers("/css/**","/js/**","/img/**","lib/**");
해당 경로의 파일들은 SpringSecurity가 무시할 수 있도록 설정합니다.
즉 이 파일들은 무조건 통화하며 파일 기준은 resources/static 디렉터리입니다.
configure(HttpSecurity http)
-HttpSecurity를 통해 HTTP요청에 대한 웹 기반의 보안을 구성할 수 있습니다.
authorizeRequests()
HttpServletRequest에 따라 접근을 제한합니다.
antMatchers()메서드로 ㅡㄱ정 경로를 지정하며 permitAll(),hasRole()메서드로 역할에 따른 접근 설정을 잡아줍니다
롤은 권한을 의미합니다,
.anyRequest().authenticated()
->모든 요청에 대해, 인증된 사용자만 접근하도록 설정할 수 있습니다.
formlogin()
->form 기반으로 인증을 하도록 합니다 로그인 정보는 기본적으로 HttpSession을 이용합니다.
.loginPage("/user/login")
기본 제공되는 form말고 커스텀 로그인 폼을 사용하고 싶으면 loginPage() 메서드를 사용합니다.
이 때 커스텀 로그인 form의 action경로와 loginPage()의 파라미터 경로가 정확히 일치해야 인증을 처리할 수 있습니다.
.defaultSuccessUrl("/user/login/result")
->로그인이 성공했을 때 이동되는 페이지이며, 마찬가지로 컨트롤러에서 URL매핑이 되어 있어야 합니다.
.usernameParameter("파라미터명")
- 로그인 form에서 아이디는 name=username 인 input을 기본적으로 인식하는데, usernamePatameter()메서드를 통해 파라미터명을 변경할 수 있습니다.
logout()
- 로그아웃을 지원하는 메서드이며 WebSecurityConfigurerAdapter를 사용할 때 자동으로 적용됩니다.
기본적으로 "/logout" 에 접근하면 HTTP세션을 제거합니다.
.logoutRequestMatcher(new AntPathRequestMatcher("/user/logout"))
- 로그아웃의 기본 URL(/logout)이 아닌 다른 URL로 재저으이 합니다.
.invalidateHttpSession(true)
-HTTP세션을 초기화하는작업입니다.
deleteCookies("KEY명")
- 로그아웃 시 특정 쿠키를 제거하고 싶을 때 사용하는 메서드입니다.
configure(AuthenticationManagerBuilder auth)
- 스프링시큐리티에서는 모든 인증은 AuthenticationManager를 통해 이루어지며 AuthenticationManager를 생성하기 위해서는 AuthenticationManagerBuilder를 사용합니다.
로그인 처리 즉, 인증을 위해서는 UserDetailService를 통해서 필요한 정보들을 가져옵니다.
ex)auth.userDetailsService(boardService).passwordEncoder(passwordEncoder());
->서비스 클래스(boardService)에서 이를 처리합니다.
서비스 클래스에서는 UserDetailsService인터페이스를 implement하여 loadUserByUsername()메서드를 구현하면 됩니다.
비밀번호 암호화를 위해 passwordEncoder를 사용하고 있습니다.
loadUserByUsername()
-사용자의 계정정보와 권한을 갖는 UserDetails 인터페이스를 반환해야합니다.
-매개변수는 로그인 시 입력한 하이디입니다 엔티티의 PK를 뜻하는게 아니고 유저를 식별할 수 있는 어떠한 값을 의미합니다.
springSecurity에서는 username이라는 이름으로 사용합니다. ( form name 의 설정값에 따라 바뀝니다.)
authorities.add(new SimpleGrantedAuthority());
롤을 부여하는 코드입니다. 롤 부여 방식은 여러가지가 있지만 회원가입할 때 ROLE을 정할 수 있도록
ROLE Entity를 만들어 매핑해주는 것이 좋은 방법입니다.
new User()
- return은 SpringSecurity에서 제공하는 UserDetails를 구현한 User를 반환합니다.
(org.springframework.security.core.userdetails.User)
- 생성자의 각 매개변수는 순서대로 아이디,비밀번호,권한리스트입니다.
- view -
sec:authorize를 사용하여, 사용자의 Role에 따라 보이는 메뉴를 다르게 할 수 있습니다.
isAnonymous()
- 익명의 사용자일 경우 노출
isAuthenticated()
- 인증된 사용자일 경우
hasRole()
- 특정 롤을 가진 사용자
[ csrf token ]
- Spring Security가 적용되면 POST 방식으로 보내는 모든 데이터는 csrf token값이 필요 합니다.
토큰 값이 없는 상태에서 form을 전송할 경우, 컨트롤러에 POST 메서드를 매핑할 수 없다는 에러가 발생합니다.
error : HttpRequestMethodNotSupportedException: Request method 'POST'
로그인 시 아이디의 name 애트리뷰트 값은 username이어야만 합니다.
sec : authentication="name"
- username의 값을 가져옵니다.
! 위에 언급한 내용엣 post전송 시 시큐리티에서는 csrf값을 포함시켜 넘겨줬어야 한다고 했는데요, 넘겨주지 않고 form을 전송하는 방법은 th:action을 사용하면 타임리프가 csrf 토큰 값을 자동으로 추가해주므로 편리합니다.
즉 타임리프에서 "th:action" 을 이용할 경우, csrf token 값을 자동으로 추가해줍니다.
'Spring' 카테고리의 다른 글
[spring]RestTemplate란? (0) | 2020.08.13 |
---|---|
[springSecurity]스프링 시큐리티 (0) | 2020.08.08 |
@ModelAttribute와@RequestParam (0) | 2020.07.26 |
@RequestBody,@ResponseBody (0) | 2020.07.25 |
메시지 컨버터란? (0) | 2020.07.25 |