티스토리 뷰

@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