[코드로 배우는 스프링부트] chapter12. API 서비스 만들기

이용준·2023년 6월 22일
0


1.API 서버를 위한 구성

  • CSR(Client Side Rendering) 방식이 점차 사용됨
  • API 서버 : 클라이언트가 원하는 데이터를 제공하는 서버

    즉, 순수하게 원하는 데이터만 제공하는 서버

  • Controller에서 @RestController 사용

2. API 서버를 위한 필터

  • 외부에서 API 호출시 주로 '인증 정보' or '인증 키(key≈token)'를 같이 전송해 처리
  • 외부에서 특정 API 호출시 반드시 인증에 사용할 토큰을 같이 전송
  • 서버에서는 이 토큰을 검증

1) OncePerRequestFilter

  • 매번 동작하는 기본 필터(추상 클래스)
  • 상속을 통해 사용 가능
    public class ApiCheckFilter extends OncePerRequestFilter{
    		  ...
    }

.addFilterBefore(선행 필터, 이후 필터) - 해당 메서드로 필터 동작 순서 변경 가능


3. API를 위한 인증처리

  • ApiLoginFilter
    • 특정한 URL로 외부에서 로그인 가능하도록 함
    • 로그인 성공 시 Authorization(인가) 헤더 값으로 이용할 데이터 전송
    public class ApiLoginFilter AbstractAuthenticationProcessingFilter{
      ...
      @Override
      public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
        ...
      }
    }
    • AbstractAuthenticationProcessingFilter
      • 추상 메서드
      • attempAuthentication() 추상 메서드와 문자열로 패턴을 받는 생성자 필요
    • SecurityConfig 클래스에 추가
    • AbstractAuthenticationProcessingFilter는 AuthenticationManager 객체 반드시 필요

1. Authorization 헤더 처리

Authorization, 클라이언트에서 전송한 Request에 포함된 Authorization 헤더 값 파악해 정상 요청 여부 판단

  • 헤더에 따라 다르게 동작하는 코드 작성 이후 과정

    1. 외부에서 인증할 수 있는 인증 처리
    2. ApiCheckFilter가 사용할 Authorization 헤더 값 발행하기
  • StringUtils.hasText(String)

    1. null 아니고(and &&)
    2. 길이가 0보다 크고(and &&)
    3. 공백이 아닌 문자열 하나 이상 포함 여부

2. AuthenticationManager 이용해 인증 처리

  • AuthenticationManager, ApiLoginFilter 정상적으로 동작하기 위해 내부적으로 동작
  • authenticate() 메서드를 지니며 파라미터와 리턴 타입이 동일
authentication(Authentication authentication)
- authentication 타입의 객체는 'xxxToken' 사용

인증 실패 처리

ApiLoginFilter 직접 인증 이후 Success or Failure 처리
1. 메서드 override 사용해 처리
1. 인증 실패, JSON 결과 전송 되도록 수정
2. 인증 성공, 클라이언트가 보관할 인증 토큰 전송
2. 별도의 클래스 지정

인증 성공 처리

  • AbstractAuthenticationProcessingFilter - @override successfulAuthentication()
    • successfulAuthentication(Authentication authResult)
    • Authentication, 인증 성공한 사용자 인증 정보 포함

JWT 토큰 생성 ・ 검증

  • JWT

    • 인증 성공한 사용자에게 JWT 전송
    • API 호출시 해당 Request 정상 요청인지 확인하는 용도로 사용
    Header.Paylod.Signature
    
    - Header, 토큰 타입과 알고리즘 의미 (HS256 or RSA)
    - Payload, 이름(name)과 값(value) 쌍을 Claim이라 하며 이를 모아둔 객체를 의미
    - Signature, 헤더의 인코딩 값과 정보의 인코딩 값을 더해 비밀 키로 해시 함수화한 결과

JWT 용도

  1. 인증 성공시 JWT 문자열 만들어 클라이언트에 전송
  2. 클라이언트가 보낸 토큰 값 검증
  • build.gradle 추가
implementation 'io.jsonwebtoken:jjwt:0.9.1'
implementation 'javax.xml.bind:jaxb-api:2.3.0'
  1. JWTUtil 클래스
  2. generateToken(String cotent) - 토큰 생성
  3. validateAndExtract(String tokenStr) - 유효 시간 및 검증
  4. Filter에 JWT 적용
  5. 생성과 검증에 문제 없으면 ApiLoginFilter/ApiCheckFilter에 적용
  6. ApiLoginFilter는 JWTUtil 생성자에 주입
profile
뚝딱뚝딱

0개의 댓글