본문 바로가기

SpringSecurity

SpringSecurity(Authentication)

반응형

 그전시간에 계속 해서 Authentication(인증)에 대해서 언급을 했다 그러면 도대체!! Authentication(인증)이 뭐냐!! 

이제 알아보자 !

 

Authtication은 말그대로 너가 누구냐! 당신은 누구냐!를 증명하는것이다

 

  • 사용자의 인증 정보를 저장하는 토큰개념
  • 인증시 id와password를 담고 인증 검증을 위해 전달되어사용된다
  • 인증 후 최종 인증 결과(user 객체 권한정보) 를 담고 SecurityContext에 저장되어 전역적으로 참조가 가능하다
    • Authentication authentication = SecurityContextHolder.getContext().getAuthentication() // 인터페이스
  • 구조(속성)
    • principal : 사용자 아이디 혹은 User 객체를 저장
    • credentials: 사용자 비밀번호
    • authorities: 인증된 사용자의 권한 목록
    • details: 인증 부가 정보
    • Authenticated: 인증여부

 

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

인증시작과 끝을 한번보자 

 

사용자의 로그인을 시도하게되면 UsernamePasswrodAutheticationFilter 가 전달받고 Authentication(인증객체) 를 만든다

그리고 principal속성에는 사용자의 아이디를 저장하고 Credentials속성에는 패서워드를 저장한다 저장된 정보들은 인증검증을 받기위해서 사용된다

 

AuthenticationMannager가 인증객체를 가지고 인증처리를 시작한다 인증에 성공되면 Authentication(인증객체)를 새로 만든다 여기서 보면 Mannager로 받기전 인증객체와 받고나서 새로생성된 인증객체는 동일한타입으로 만든다 차이점은 principal과 Credentials를 보면되는데 처음에는 사용자의 아이디와 패스워드를 저장하지만 이후에는 인증에 성공한 결과를 담고 Authorities 권한 목록을 담는다 즉 이후에 만들어진 인증객체는 유저의정보와 권한정보를 담는다 이후에는  SecurityContextHolder로 인증객체를 저장한다 

 

 

 

 

UsernamePasswordAuthentication.java

인증필터가 인증처리를 시작하고 아래로 좀더 내려가다 보면 

 

 

UsernamePasswordAuthentication.java

입력한 username 과 password를 확인이 되고 이정보들을 담아서 

UsernamePasswordAuthentication.java

AuthenticationMannager(인증관리자) 에게전달한다 

 

 

 

 

 

ProviderManager.java

 

프로바이더 매니저(AuthenManager구현체) 에서 여기에서 인증객체를 담아서 위임하게된다 역시 디버깅! 해보면 확인이 가능하다!

 

 

AbstractUserDetailAuthentication.java

프로바이더 매니저(AuthenticationManager구현체) 에서 인증에 성공한 이후에는 인증결과를 여기로 전달해주고 이클래스는 Authentication(인증객체)를 새로 만든다 위에서 보면 두번째로 생성되는 객체는 권한정보가 담아서 전달하기 때문에 여기서 인증객체를 새로 만들어준다

 

 

 

UsernamePasswordAuthenticationToken.java

 

여기에는 두가지의 생성자가 있다

하나는 유저가 로그인을 시도했을때 이름과 패스워드를 담는 Authenrtication(인증객체)

그리고 인증에 성공한이후에 결과를 담을 Authentication(인증객체) 

두번째 생성자를 보면 파라미터에 권한정보를 담는 authorities를 확인할수 있다.

providerManager.java

 

 ProviderManager(AuthenticationManager구현체)에서 인증결과를 담은 인증 또는 토큰을 AuthenticationManager에게 전달한다 

AuthenticationManager는 자기를 호출한 필터(UsernamePasswordAuthenticationFilter)에게 다시 전달한다 

AbstractAuthenticationProcessingFilter.java

 

최종으로 리턴받은 토큰(인증결과를 담은 객체 혹은 토큰)을 SecurityContextHolder에 저장한다.

인증결과 객체를 우리가 사용하고자 한다면 SecurityContextHolder.getContext.getAuthentication 으로 장소관계없이 참조가 가능하다.

 

 

 

AbstractSecurityContextinterceptor.java method = authenticateIfRequired

 

이필터는 SecurityContextHolder에서 인증객체를 참조해서 인가처리하는 클래스이다. 

 

여기까지가 유저가 처음 로그인을 시도해서 SpringSecurity가 인증처리를 하는 과정이다.

 

 

반응형