SpringSecurity

Shaun·2022년 1월 8일
1

Spring Security

목록 보기
5/19

이전에 spring security를 공부한적 있지만 계속 진행되지 않고 방치만 하고 있다가.... 벌써 했던것도 많이 잊어버렸고 해서 아예 처음부터 체계적으로 다시 하는중이다!

SpringSecurity

  • SpringSecurity 를 디펜던시에 추가하면 어느정도 보안은 되지만 세부적인건 우리가 직접 설정 해줘야한다.

  • 사진에서 보이는것처럼 SecurityConfig 클래스가 webSecurityConfigurerAdapter 를 상속 받으면서 시작된다.

  • 시큐리티에는 크게 인증/인가 가 있다. 인증은 말그대로 내가 누구인지 인증하는 것이고 인가는 인증이 끝나면 그에 해당하는 '권한'을 주는 것이다.

  • 시큐리티의 기본 틀이라 생각하면 된다. HttpSecurity http로 세부적인 조정을 하면 된다

  • 어떠한 접근(request)든 authenticated() 인증이되어야한다는 코드다.

FormLogin

  • 기본적인 프로세스를 알아보자.
  1. 클라에서 아이디와 비밀번호로 '인증'을 시도한다. 인증이 실패하면 다시 '로그인페이지' 로 리다이렉트 된다.
  2. 다시 '인증'을 시도하고 성공시 '인증결과' 를 담은 '토큰' 을 생성한다. 그리고 그 '토큰'을 '세션'에 담는다.
  3. 인증이 필요할때마다 세션에 저장된 토큰을 사용한다.

인증API -FormLogin

  • 학습을 어느정도하고 작성하는 글이라 빨간줄이 있습니다. 무시해주세요를

.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") 로 리다이렉트를 보낼수 있다.

그럼 defaultSuccessUrl 와 successHandler 의 차이는 뭘까?

  • 가장 큰 차이점은 좀더 섬세하게 커스터 마이징 할수 있다는 점이다. 전자는 그냥 성공시 해당 URL페이지로 이동만 하지만 후자는 인증한 유저 즉 Authentication 에 있는 인증결과를 찾아 인증한 유저의 이름을 알수도 있다. 좀더 섬세하게 컨트룰이 가능하다는 차이점이 있다

Login Form 인증 Process

  • 코드로 설정하는 법까지는 알았고 이제 그 과정을 자세히 살펴보자!

  • 클라로부터 아이디와,비밀번호 request가 오면 요청정보가 매칭되는지 확인을 한다. 그러고 난후에 Authentication 객체에 클라가 보낸 유저네임과 비밀번호를 담아서 인증을 위해 AuthenticatinManager 에게 보낸다.

  • 여기서 인증이 일어난다. AuthnticatinManagerAuthetnicationProvider에게 위임을 하여 실질적인 인증절차가 시작된다. 실패시 exception이 발생한다

  • 인증이 성공하면 Authentication 객체에 인증성공한 유저네임과 권한을 담에 SC(SecurityContext) 에 저장한다.

  • 인증이 성공했으니 그담음으로는 SuccessHandler 가 실행된다.

인증 -> 인증결과를 토큰에 담고 -> SC에 저장 -> 서버 세션에 저장

Logout

  • 로그아웃을 하면 세션이 삭제 된다. (세션에는 인증결과 토큰이 들어있다.)

  • 로그아웃은 간단하다! 밑에 코드에대한 설명은 따로 하지 않겠다.

    .logout()
    .logoutUrl("/logout")
    .logoutSuccessUrl("login")

  • .addLogoutHandler(new LogoutHandler()){}
    -로그아웃시 핸들러를 추가 하는 코드다.
    -핸들러는 좀더 로직을 구체적이고 내가 원하는데로 커스터마이징 할수 있다는 장점이 있다.

  • logOutSuccessHandler(new logOutSuccessHandler()){}
    -앞에서 설명한것과 동일하다 그냥 url로 보내는 코드보다 좀더 다양하게 로직 구현가능

  • 로그아웃 프로세스이다. 로그인과 동일하게 처음에 Matcher 을 통해 url 검사를 하고 Authentication 에 해당 유저의 정보를 담아 보낸다.

  • 로그아웃 핸들러가 인증결과 토큰이 들어있는 세션을 무효화 시키고 쿠키를 삭제한다.

Remember Me

  • 세션이 만료되어고 웹브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는 기능이다.

  • 쉽게 설명하면 우리가 로그인 창에서 많이 봐온 이 아이디를 기억하기 뭐 이런 기능이다. 한번 자세히 살펴보자

  • 인증을 성공하면 Remember-Me 쿠키 설정

  • Authentication 객체가 Null일떄 = 세션만료, 인증객체 없을때
    => 그떄 rememberAuthenticationFilter 발동

  • 토큰 시간 설정이나, alwaysRemeberMe(true) 로 리멤버미 체크를 표시 안해도 저절로 실행되게 할수 있다.

  • 리멤버미 프로세스다.

  • Remember 는 그 인증됐다는 값을 ‘쿠키’로 줘서 나중에 세션이 삭제되도. ‘쿠키’로 다시 인증이 가능하다.

  • 쿠키로 다시 인증 하면 세션이 다시 생성됀다.(쿠키는 리퀘스트 헤더에 넣어서 보낸다)

Anonoymous AuthenticationFilter

  • 익명사용자 처리 필터이다.

  • 익명사용자와 인증 사용자 구분해서 처리하기위한 용도이다.

  • 어나니머스 객체는 사용자 security context 안에있는 Authentication 이 null 일때 ‘토큰’을 따로 만들어 거기에 null값을 넣어준다. 어나니머스인지 아닌지 구별하는 용도로 사용
profile
호주쉐프에서 개발자까지..

0개의 댓글