이전에 spring security를 공부한적 있지만 계속 진행되지 않고 방치만 하고 있다가.... 벌써 했던것도 많이 잊어버렸고 해서 아예 처음부터 체계적으로 다시 하는중이다!
SpringSecurity 를 디펜던시에 추가하면 어느정도 보안은 되지만 세부적인건 우리가 직접 설정 해줘야한다.
사진에서 보이는것처럼 SecurityConfig 클래스가 webSecurityConfigurerAdapter 를 상속 받으면서 시작된다.
시큐리티에는 크게 인증/인가 가 있다. 인증은 말그대로 내가 누구인지 인증하는 것이고 인가는 인증이 끝나면 그에 해당하는 '권한'을 주는 것이다.
시큐리티의 기본 틀이라 생각하면 된다. HttpSecurity http로 세부적인 조정을 하면 된다
어떠한 접근(request)든 authenticated() 인증이되어야한다는 코드다.
.loginPage("/loginPage") // 로그인 페이지
.defaultSuccessUrl("/") //로그인 성공시
.failureUrl("/loginPage")//로그인 실패시
.usernameParameter("userId")// 아이디 파라미터 설정
.passwordParameter("passWd") // 패스워드 파라미터 설정
.loginProcessingUrl("login_proc") //login Form Action URL
.successHandler(new AuthenticationSuccessHandler() {}
-로그인 성공시 실행되는 프로세스
-Authentication 은 인증하고 난뒤 '인증결과' 를 넣어 두는 곳이다.
-Authentication.getName() 을 하면 인증한 유저 네임이 나온다
.failureHandler(new AuthenticationFailureHandler() {}
-반대로 로그인 실패시 실행되는 프로세스 이다.
-exceptin.getMessage() 로 오류 내용을 볼수 있다.
-실패한뒤 response.sendRedirect("loginPage") 로 리다이렉트를 보낼수 있다.
클라로부터 아이디와,비밀번호 request가 오면 요청정보가 매칭되는지 확인을 한다. 그러고 난후에 Authentication 객체에 클라가 보낸 유저네임과 비밀번호를 담아서 인증을 위해 AuthenticatinManager 에게 보낸다.
여기서 인증이 일어난다. AuthnticatinManager 가 AuthetnicationProvider에게 위임을 하여 실질적인 인증절차가 시작된다. 실패시 exception이 발생한다
인증이 성공하면 Authentication 객체에 인증성공한 유저네임과 권한을 담에 SC(SecurityContext) 에 저장한다.
인증이 성공했으니 그담음으로는 SuccessHandler 가 실행된다.
인증 -> 인증결과를 토큰에 담고 -> SC에 저장 -> 서버 세션에 저장
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("login")
- .addLogoutHandler(new LogoutHandler()){}
-로그아웃시 핸들러를 추가 하는 코드다.
-핸들러는 좀더 로직을 구체적이고 내가 원하는데로 커스터마이징 할수 있다는 장점이 있다.
- logOutSuccessHandler(new logOutSuccessHandler()){}
-앞에서 설명한것과 동일하다 그냥 url로 보내는 코드보다 좀더 다양하게 로직 구현가능
로그아웃 프로세스이다. 로그인과 동일하게 처음에 Matcher 을 통해 url 검사를 하고 Authentication 에 해당 유저의 정보를 담아 보낸다.
로그아웃 핸들러가 인증결과 토큰이 들어있는 세션을 무효화 시키고 쿠키를 삭제한다.
세션이 만료되어고 웹브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는 기능이다.
쉽게 설명하면 우리가 로그인 창에서 많이 봐온 이 아이디를 기억하기 뭐 이런 기능이다. 한번 자세히 살펴보자
인증을 성공하면 Remember-Me 쿠키 설정
Authentication 객체가 Null일떄 = 세션만료, 인증객체 없을때
=> 그떄 rememberAuthenticationFilter 발동
리멤버미 프로세스다.
Remember 는 그 인증됐다는 값을 ‘쿠키’로 줘서 나중에 세션이 삭제되도. ‘쿠키’로 다시 인증이 가능하다.
쿠키로 다시 인증 하면 세션이 다시 생성됀다.(쿠키는 리퀘스트 헤더에 넣어서 보낸다)
익명사용자 처리 필터이다.
익명사용자와 인증 사용자 구분해서 처리하기위한 용도이다.
- 어나니머스 객체는 사용자 security context 안에있는 Authentication 이 null 일때 ‘토큰’을 따로 만들어 거기에 null값을 넣어준다. 어나니머스인지 아닌지 구별하는 용도로 사용