본문 바로가기

Spring

Spring Security의 인증 과정과 주요 모듈

728x90

 

1. Spring Security 인증 과정

 

1) 로그인 요청

  • 사용자가 폼에 아이디, 패스워드를 입력하면 HttpServletRequest에 아이디, 비밀번호가 전달된다.
  • AuthenticationFilter가 넘어온 아이디, 비밀번호의 유효성 검사를 실시한다.

2) Authentication 생성

  • 유효성 검사 후 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다.

3) Authentication 전달

  • 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에 전달한다.

4) UsernamePasswordAuthenticaionToken을 AuthenticationProvider에 전달

5) 유효성 검증

  • 사용자 아이디를 UserDetailsService로 보낸다.
  • UserDetailsService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다.

6) 사용자 조회

  • 데이터베이스에 있는 사용자 정보를 가져온다.

7) UserDetails 생성

  • 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 진행한다.

8) UserDetails를 Authentication Provider로 전달

9) UserDetails를 Authentication Manager로 전달

10) AuthenticationFilter로 UserDetails를 넘김

11) Authentication 저장

  • 8~10까지 인증이 완료되면 SecurityContextHolder에 Authentication을 저장한다.
  • 인증 성공 여부에 따라 성공 시 AuthenticationSuccessHandler, 실패 시는 AuthenticationFailuerHandler를 실행한다.

 

2. SpringSecurity의 주요 모듈

1) SecurityContextHolder, SecurityContext, Authentication

  • 유저의 아이디와 패스워드 사용쟈 정보를 넣고 실제 가입된 사용자인지를 체크한다.
  • 인증에 성공하면 사용자의 principal과 credential정보를 authentication 안에 담는다.
  • Authenticaion 클래스는 현재 접근하는 주체의 정보와 권한을 담는 인터페이스로 SecurityContext의 Authenticatino에 저장된다.
  • SecurityContextHolder를 통해 SecurityContext에 접근하고 SecurityContext를 통해 Authenticatino에 접근할 수 있다.

2) UsernamePasswordAuthenticationToken

  • Authentication을 구현한 AbstracAuthenticationToken의 하위의 하위 클래스이다.
  • 유저의 ID가 Principal, PW는 Credential 역할을 하는데, UsernamePasswordAuthenticationToken의 첫 번째 생성자는 인증 전제 객체를 생성하고 두 번째는 인증이 완료된 객체를 생성한다.

3)AuthenticationManager

  • 인증에 대한 부분을 처리하는 클래스로 실질직으로는 AuthenticatinoManager에 등록된 AuthenticationProvider에 의해서 처리된다.
  • 인증에 성공하면 두 번째 생성자를 이용해 생성한 객체를 SecurityContext에 저장한다.

4) AuthenticationProvider

  • 실제 인증에 대한 부분을 처리하는 작업을 치룬다.
  • 인증 전 Authenticatino객체를 받아 인증이 완료된 객체를 반환하는 역할을 하고 AuthenticatinoProvider인터페이스를 구현해 custom AuthenticationProvider를 작성하고 AuthenticationManager에 등록하면 된다.

5) ProviderManager

  • AuthenticationManager를 구현한 것으로 AuthenticationProvider를 구성하는 목록을 가진다.

6) UserDetailService

  • UserDetails객체를 반환하는 하나의 메소드만을 가진다.
  • 일반적으로 이를 구현한 클래스에서 UserRepository를 주입받아 데이터베이스와 연결해 처리한다.

7) UserDetails

  • 인증에 성공해 생성된 UserDetails클래스는 Authenticatino객체를 구현한 UsernamePasswordAuthenticatinoToken을 생성하기 위해 사용되는데, UserDetails를 구현해 처리 가능하다.

8) SecurityContextHolder

  • 보안 주체의 세부 정보를 포함해 응용프로그램의 현재 보안 컨텍스트에 대한 세부 정보가 저장된다.

9) SecurityContext

  • Authentication을 보관하는 역할을 하고 SecurityContext를 통해 Authentication을 저장하거나 꺼내올 수 있다.

10) GrantedAuthority

  • 현재 사용자(Principal)가 갖고 있는 권한을 의미하고 ROLE_*의 형태로 사용한다.
  • UserDetailsService에 의해 불러올 수 있고 특정 자원에 대한 권한이 있는지 없는지를 검사해 접근 허용 여부를 결정한다.

 

 

 

 

 

 

[참고 자료]

https://velog.io/@hope0206/Spring-Security-%EA%B5%AC%EC%A1%B0-%ED%9D%90%EB%A6%84-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%97%AD%ED%95%A0-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

https://velog.io/@wlstjdwkd/Spring-Security-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0%EB%9E%80

https://velog.io/@kwj1830/codestates29

728x90