Spring Security와 jwt

EunBeen Noh·2024년 5월 7일
0

SpringAdvanced

목록 보기
3/6

Spring Security란?

  • 스프링 기반 어플리케이션의 보안(인증, 권한, 인가)을 담당하는 스프링 하위 프레임워크
  • 왜 쓰는가?
    • 보안과 관련해서 체계적으로 많은 옵션들을 제공
      -> 개발자의 입장에서는 하나하나 보안 관련 로직을 작성하지 않아도 됨

Spring Security 용어

  • 인증(Authentication) : 해당 사용자가 본인인지를 확인하는 절차
  • 인가(Authorization) : 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차
  • 접근 주체(Principal) : 보호받는 Resource에 접근하는 대상
  • 비밀번호(Credential) : Resource에 접근하는 대상의 비밀번호
  • 권한 : 인증된 주체가 어플리케이션의 동작을 수행할 수 있도록 허락되어 있는지 결정
    • 인증 과정을 통해 주체가 증명된 이후 권한을 부여 가능
    • 권한 부여 영역
      - 1. 웹 요청 권한과 메서드 호출
      - 2. 도메인 인스턴스에 대한 접근 권한 부여

인증(Authentication) vs 인가(Authorization)

  • 인증: 사용자 신원을 확인하는 행위
  • 인가: 사용자 권한을 확인하는 행위
    웹에 접근하는 상황)
  • 인증: 로그인을 하는 행위
  • 인가: 역할에 따른 사용 권한을 관리하는 행위

Spring Security의 절차

  • 인증 절차를 거친 후 인가 절차 진행
  • 인가 과정 내에서 해당 리소스에 대한 접근 권한 유무에 대한 확인 진행
  • 인증/인가를 위한 인증 방식은 Principal을 아이디)로, Credential을 비밀번호로서 사용
  • 기본적으로 세션/쿠키(토큰) 방식을 사용

동작 원리

일반적인 Form Login 순서

  1. 요청 수신
  • 사용자가 form을 통해 로그인 정보가 담긴 Request 전송
  1. 토큰 생성
  • AuthenticationFilter가 요청을 받아서
  • UsernamePasswordAuthenticationToken토큰(인증용 객체)을 생성
  • UsernamePasswordAuthenticationToken은 해당 요청을 처리할 수 있는 Provider를 찾는데 사용
  1. AuthenticationFilter로 부터 인증용 객체를 전달 받음
  • Authentication Manager에게 처리 위임
  • Authentication Manager는 List형태로 Provider들을 갖고 있는 상태
  1. Token을 처리할 수 있는 Authentication Provider 선택
  • 실제 인증을 할 AuthenticationProvider에게 인증용 객체를 다시 전달
  1. 인증 절차
  • 인증 절차가 시작되면 AuthenticationProvider 인터페이스가 실행
  • DB에 있는 사용자의 정보와 화면에서 입력한 로그인 정보를 비교
  1. UserDetailsService의 loadUserByUsername 메소드 수행
  • AuthenticationProvider 인터페이스에서는 authenticate() 메소드를 오버라이딩한다.
  • 이 메소드의 파라미터인 인증용 객체로 화면에서 입력한 로그인 정보를 가져올 수 있음
  1. AuthenticationProvider 인터페이스에서 DB에 있는 사용자의 정보를 가져오려면, UserDetailsService 인터페이스를 사용

  2. UserDetailsService 인터페이스는 화면에서 입력한 사용자의 username으로 loadUserByUsername() 메소드를 호출 -> DB에 있는 사용자의 정보를 UserDetails 형으로 가져옴.

  • 만약 사용자가 존재하지 않으면 예외 발생
  • DB에서 가져온 이용자의 정보와 화면에서 입력한 로그인 정보를 비교하게 되고, 일치하면 Authentication 참조를 return, 일치 하지 않으면 예외 발생
  1. 인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담은 이후 AuthenticationSuccessHandle를 실행(실패시 AuthenticationFailureHandler를 실행)

Filter

(UsernamePassword)AuthenticationFilter

  • 아이디와 비밀번호를 사용하는 form 기반 인증
  • 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리인 AuthenticationManager를 통한 인증 실행
  • 인증이 성공한다면 인증용 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
  • 실패한다면 AuthenticationFailureHandler 실행

AuthenticationProvider

  • 화면에서 입력한 로그인 정보와 DB정보를 비교
  • Spring Security의 AuthenticationProvider을 구현한 클래스로 security-context에 provider로 등록 후 인증절차를 구현
  • login view에서 login-processing-url로의 form action 진행 시 해당 클래스의 supports() > authenticate() 순으로 인증 절차 진행

UserDetailsService

  • UserDetailsService 인터페이스는 DB에서 유저 정보를 가져오는 역할

UserDetails

  • 사용자의 정보를 담는 인터페이스, 직접 상속받아 사용
  • 오버라이딩 되는 메소드들만 Spring Security에서 알아서 사용하기 때문에 별도로 클래스를 만들지 않고 변수를 추가해서 같이 사용해도 무방
  • 해당 변수들은 getter, setter를 만들어서 사용하면 된다.

0개의 댓글