본문 바로가기
TIL

내일배움캠프 6주차 Spring JWT, Spring Security, Validation

by 율량동박씨 2024. 5. 23.

오늘의 키워드

  • JWT
  • Filter
  • Spring Security 프레임워크
  • Validation

오늘의 내용

  • JWT
    • JSON Web Token은 JSON포맷을 이용해 사용자에 대한 속성을 저장하는 Claim기반의 Web Token이고 보통 쿠키 저장소를 사용해 저장한다
    • 로그인 정보를 서버에 저장하지 않고 클라이언트에 로그인 정보를 JWT로 암호화 후 저장해 모든 서버가 동일한 Secret Key를 소유하고 이를 통한 암호화, 위조검증을 한다
    • 누구나 평문으로 복호화가 가능하지만 Secret Key가 없으면 수정이 불가능하다
    • JWT구조 중 Payload부분에는 토큰에 담긴 정보가 들어있다
      • 여기에 담긴 정보 한 조각을 Claim이라 하고 key-value 한 쌍으로 이루어져 있다. 토큰에는 여러 개의 Claim을 넣을 수 있다
      • @Enumerated(value = EnumType.STRING)
        • EnumType을 DB컬럼에 저장할 때 사용한다
        • EnumType.STRING 옵션을 사용하면 Enum의 이름을 DB에 그대로 저장한다
    • 장점
      • 동시 접속자가 많을 때 서버 측 부하를 낮출 수 있다
      • 클라이언트와 서버가 다른 도메인을 사용할 수 있다
    • 단점
      • 구현의 복잡도가 증가한다
      • 담는 내용이 커질수록 네트워크 비용이 증가한다
      • 기생성 된 JWT를 일부만 만료시킬 방법이 없다
      • Secret Key유출 시 JWT조작이 가능하다
    • 사용흐름
      • 클라이언트가 로그인 시 서버에서 로그인 정보를 JWT로 암호화한다
      • 서버에서 직접 쿠키를 생성해 JWT를 담아 클라이언트 응답에 전달한다( 이때 전달방법은 개발자가 정한다)
      • 클라이언트에서 JWT를 통해 인증한다
  • Filter
    • 웹 애플리케이션에서 관리되는 영역으로 클라이언트로부터 오는 요청과 응답에 대해 최초/최종 단계의 위치이며 이를 통해 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가할 수 있다
    • 주로 범용적으로 처리해야 하는 작업들에 활용한다. 예를 들면 로깅 및 보안 처리 등
    • 인증, 인가와 관련된 로직을 비즈니스 로직과 분리해 관리할 수 있다
  • Spring Security 프레임워크
    • Spring Security 프레임워크는 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해 줌으로써 개발의 수고를 덜어준다
    • Spring Security - Filter Chain
      • Spring에서 모든 호출은 DispatcherServlet을 통과하고 이후 각 요청을 담당하는 Controller로 분배한다
      • 이때 각 요청에 대해 공통적으로 처리해야 할 필요가 있을 때 DispatcherServlet이전에 단계가 Filter이다
      • Spring Secrurity도 인증 및 인가를 처리하기 위해 Filter를 사용하는데 FilterChainProxy를 통해 상세로직을 구현한다
      • From Login기반 인증은 인증이 필요한 URL요청이 들어왔을 때 인증이 되지 않았으면 로그인 페이지를 반환하는 형태이다
      • UsernamePasswordAuthenticationFilter는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한다
        • 인증과정
          • 사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 인증된 사용자의 정보가 담기는 인증 객체인 Authentication의 종류 중 하나인 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증을 시도한다
          • 실패하면 SecurityContextHolder를 비웁니다
          • 성공하면 SecurityContextHolder에 Authentication를 세팅한다
      • Spring Security에 "권한 (Authority)" 설정방법
        • UserDetailsImpl을 통해 권한 설정을 할 수 있고 권한을 1개 이상 설정이 가능하다
        • 권한 이름에는 규칙이 있는데 ROLE_로 시작을 한다("ADMIN" 권한 부여 → "ROLE_ADMIN")
        • Spring Security를 이용한 API 별 권한 제어 방법
          • Controller에 @Secured애너테이션으로 권한 설정이 가능하다
          • @Secured("권한 이름") 으로 선언한다
      • SecurityContextHolder
        • SecurityContext는 인증이 완료된 사용자의 상세 정보를 저장한다
        • SecurityContext는 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로 추상화하여 사용합니다.
  • Validation
    • 여러 오류를 예방하기 위해 검증 과정을 제공한다
    • Spring에서는 여러 검증과정을 쉽게 처리할 수 있도록 Bean Validation을 제공한다
@NotNull null불가
@NotEmpty null, "" 불가
@NotBlank null, ""," "불가
@Size 문자 길이 측정
@Max 최대값
@Min 최소값
@Positive 양수
@Negative 음수
@Email E-mail형식
@Pattern 정규표현식

오늘의 회고

  • Spring Security 들어가면서 내용이 하나도 이해가 안 돼서 큰일이다
  • 강의 듣다가 분명 똑같이 썼는데 오류가 계속 발생해서 어제처럼 실수한 줄 알았더니 강의내용에 오류가 있던 거였다 아까운 내 시간.....
  • 점점 과부화가 와서 무슨 말을 써야 할지.....🤮🤮