본문 바로가기
내일배움캠프(Sparta)/Spring

[Spring] Spring Security / Validation

by mmm- 2023. 11. 9.

1) Spring Security

: Spring 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해주는 프레임워크

 

 

CSRF

: 사이트 간 요청 위조 (Cross-site request forgery)

  • 공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용하여 웹 서버에 사용자가 의도하지 않은 요청을 전달함.
  • CSRF 설정이 되어있는 경우 html에서 CSRF 토큰 값을 넘겨주어야 요청 수신 가능
  • 쿠키 기반의 취약점을 이용한 공격이기 때문에 REST 방식의 API에서는 disable 가능

Spring Security - Filter Chain

  • Spring에서 모든 호출은 DispatcherServlet을 통과하게 하고 이후에 각 요청을 담당하는 Cotroller로 분배되는데, 이 때 각 요청에 대해 공통적으로 처리해야할 때 DispatcherServlet 이전 단계인 Filter가 필요

  • Spring Security도 인증 및 인가를 처리하기 위해 Filter를 사용.
    이때 Spring Security는 FilterChainProxy를 통해 상세 로직을 구현하고 있음.
  • Spring Security가 Filter 기반으로 동작하고 있다는 것❗

Form Login 기반 인증

: 인증이 필요한 URL 요청이 들어왔을 때 인증이 되지 않았다면 로그인 페이지를 반환하는 형태

  • Security에서 제공하는 기본적인 Form Login 기반 인증


내부에서 인증이 어떤 식으로 처리되는지가 중요.

가장 많이 살펴보는 필터가 바로 UsernamePasswordAuthenticationFilter

 

UsernamePasswordAuthenticationFilter (⭐)

: Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 Filter

  • 기본적으로 Form Login 기반을 사용할 때 username과 password 확인하여 인증

 

동작 과정 (인증 과정)

  1. 사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증 시도
  2. 실패하면 SecurityContextHolder를 비움
  3. 성공하면 SecurityContextHolder에 Authentication을 세팅하여 인증 처리 완료

 

  • SecurityContextHolder 
    • SecurityContextHolder안에 존재하는 SecurityConext는 인증이 완료된 사용자의 상세정보(Authentication)를 저장
    • SecurityConext는 SecurityContextHolder로 접근 가능
      // 예시코드
      SecurityContext context = SecurityContextHolder.createEmptyContext();
      Authentication authentication = new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
      context.setAuthentication(authentication); // SecurityContext 에 인증 객체 Authentication 를 저장합니다.
      
      SecurityContextHolder.setContext(context);​

 

 

 

  • Authentication
    • 현재 인증된 사용자를 나타내며 SecurityContext에서 가져올 수 있음.
    • principal : 사용자를 식별
      • Username/Password 방식으로 인증할 때 일반적으로 UserDetails 인스턴스를 넣음.
    • credentials : 주로 비밀번호, 대부분 사용자 인증에 사용한 후 비움
    • authorities : 사용자에게 부여한 권한을 GrantedAuthority로 추상화하여 사용
  • UserDetailsService
    • username/password 인증방식을 사용할 때 사용자를 조회하고 검증한 후 UserDetails를 반환.
    • Custom하여 Bean으로 등록 후 사용 가능.
  • UserDetails
    • 검증된 UserDetails는 UsernamePasswordAuthenticationToken 타입의 Authentication를 만들 때 사용되며 해당 인증객체는 SecurityContextHolder에 세팅됨. 
    • Custom하여 사용 가능.

2) Spring Security : 로그인

Spring Security 사용 전

 

Spring Security 사용 후

 

  • 사용 전과는 다르게, 앞단에 Spring Security가 인증 처리를 해줘 Client의 요청은 모두 Spring Security 를 거침 
  • Spring Security 역할
    • 인증/인가
      • 성공시 : Controller로 Client 요청 전달
        ➡️ Client요청 + 사용자 정보(UserDetails)
      • 실패시: Controller로 Client 요청 전달 ❌
        ➡️ Client에게 Error Response 보냄

로그인 처리 과정

  1. Client
    1. ) 로그인 시도
    2. ) 로그인 시도할 username, password 정보를 HTTP body로 전달 (POST 요청)
    3. ) 로그인 시도 URL은 WebSecurityConfig 클래스에서 변경 가능.
  2. 인증 관리자 (Authentication Manager)
    1. ) UserDetailsService에게 username 전달하고 회원상세 정보 요청
  3. UserDetailsService
    1. ) 회원 DB에서 회원 조회
        (정보가 존재하지 않을 시 Error 발생)
    2. ) 회원정보가 존재하면 UserDetalis로 변환
    3. ) UserDetails를 "인증 관리자"에게 전달
  4. "인증 관리자"가 인증 처리
    1. ) Client가 로그인 시도한 username, password와
        UserDetailsService가 전달해준 UserDetails의 username, password 가 일치하는지 확인
    2. ) Client가 보낸 평문의 password를 암호화하여 UserDetails의 password 암호문 비교
    3. ) 인증 성공시, 세션에 로그인 정보 저장
        인증 실패시, Error 발생

3) Validation

: 데이터가 요구사항이나 규칙에 맞는지 검사하는 것.

 

Bean Validation

  • 간편하게 사용할 수 있는 여러 annotation을 제공해줌.
@NotNull
null 불가
@NotEmpty
null, “” 불가
@NotBlank
null, “”. “ “ 불가
@Size
문자 길이 측정 (최대값, 최소값 한 번에 정해줄 때 사용)
@Max
최대값
@Min
최소값
@Positive
양수
@Negative
음수
@Email
E-mail 형식
@Pattern
정규 표현식

 

 

@Valid

  • 데이터 검증을 하고 싶은 Dto 앞에 @Valid를 달아야 해당 객체에 데이터 검증이 일어날 수 있음.

용어 정리

  • UsernamePasswordAuthenticationToken
    : 인증된 사용자의 정보가 담긴 Authentication의 종류 중 하나

'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글

[Spring] Entity 연관관계  (1) 2023.11.14
[Spring] RestTemplate  (0) 2023.11.10
[Spring] Filter  (0) 2023.11.09
[Spring] JWT / 패스워드 암호화  (0) 2023.11.08
[Spring] Authentication / Authorization / Cookie / Session  (1) 2023.11.08