블로그 프로젝트 - API 인증 / 검증 로직

최민수·2023년 3월 2일
0

[개발] Java Spring

목록 보기
3/18

인증 내용을 단순하게 받아오는 방법은 크게 3가지를 생각해 볼 수 있다.

  1. GET parameter로 넘겨서 @RequestParam 으로 받아서 검증하는 방법
  2. POST 로 받아와서 검증하는 방법
  3. Header 로 받아와서 검증하는 방법
  • 그러나, 위의 방법들을 매핑된 메서드 로직에 반복적으로 달고 검증 로직이 복잡해지면 코드가 지저분해진다.
  • 반복되는 코드엔 반드시 해결책이 있다! → 스프링 인터셉터ArgumentResolver에 대해서 조사해봤다.

스프링 인터셉터 (Spring Interceptor)

  • 스프링 인터셉터 사용은 HandlerInterceptor 인터페이스 클래스를 구현(메서드 오버라이딩)하는 식으로 한다.
  • 요청이 Controller에 도달하기 전에 먼저 Handler를 거치도록 설계되어 있다.
    • preHandle, postHandle, afterCompletion 메서드를 원하는 로직에 맞게 오버라이딩해 구현하면 된다.
    • 각 메서드 단계가 의미하는 것은?
      - preHandle: 컨트롤러 호출 전에 호출된다.
      - postHandle: 컨트롤러 호출 후에 호출된다.
      - afterCompletion: View 까지 렌더링 된 후 호출된다.
    • exculdePathPatterns: 인증을 원하지 않는 url path를 지정할 수 있다. (인증이 없어도 누구나 접근할 수 있어야 하는 페이지)
      // WebMvcConfig.java implements WebMvcConfigurer
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new AuthInterceptor())
                        .excludePathPatterns("/error", "/favicon.ico");
        }
    • Interceptor 와 Controller 간의 통신 방법을 뚫는다.
      • Prehandle 메서드에서 인증정보 accessToken을 받아오고 검증을 한 뒤, request에 setAttribute 값으로 넘겨야 controller에서 인증정보에 대한 값에 접근할 수 있다.
        request.setAttribute("userName", accessToken);
      • request의 setAttribute 메서드의 동작 방법?
        • key, value 형태로 넘기면 Controller에서 @RequestAtrribute 어노테이션으로 받아올 수 있다.

ArgumentResolver

  • ArgumentResolver 사용은 HandlerMethodArgumentResolver 인터페이스 클래스를 구현(메서드 오버라이딩)하는 식으로 한다.
  • supportsParameter, resolveArgument 메서드를 원하는 로직에 맞게 오버라이딩해 구현하면 된다.
    • supportsParameter: 원하는 타입의 dto가 넘어왔는지 확인. 즉, ArgumentResolver를 적용할 상황인지 확인하는 메서드.
      @Override
      public boolean supportsParameter(MethodParameter parameter) {
      // UserSession 이라는 dto 클래스를 받는 Controller 메서드에 적용할 것인지 확인.
          return parameter.getParameterType().equals(UserSession.class);
      } 
      @GetMapping("/foo")
      public Long foo(UserSession userSession) {
          log.info(">>>{}", userSession.id);
          return userSession.id;
      }
    • resolveArgument: Controller 호출 직전에 호출돼서 필요한 파라미터 정보를 생성해준다. 즉, 실제로 dto에 값을 세팅해주는 메서드.
      • 객체 반환 가능. ex) dto에 값을 설정해서 return 값으로 넘길 수 있음.
  • Interceptor 와 마찬가지 방법으로 WebMvcConfig.java 파일에 등록할 수 있음.
    // WebMvcConfig.java implements WebMvcConfigurer
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new AuthResolver(sessionRepository));
    }

Header 값 설정 후 테스트

  • Intellij에서 http request를 보낼 수 있는 도구가 있음.

    • .http 파일을 만들어서 http request 값 설정 가능.

       ### 로그인
        POST http://localhost:8080/auth/login
        Content-Type: application/json
        {
          "email": "lucaschoi@gmail.com",
          "password": "asdf"
        }
      
        ### 인증 페이지 요청
        GET http://localhost:8080/foo
        Content-Type: application/json
        Cookie: SESSION=4a27ab97-a5e0-4495-8805-958a49816dd5
    • 변수화 하는 방법도 조사해보기.

      • API 호출 테스트를 하다 보면 local과 dev 등 같이 환경별로 호출해야 할 수 있는데 환경마다 http file을 만드는 건 비효율적이기 때문에 환경별 변수를 파일로 지정할 수 있음.
      • json 파일 따로 만들어서 GET http://{{baseUrl}} 와 같이 local 환경에서 baseUrl 변수에 대해 지정해 줄 수 있다.

        rest-client.env.json file

        {
          "local":{
            "baseUrl":"localhost:8080"
          },
          "dev":{
            "host":"dev.sample.com"
          },
          "real":{
            "host":"sample.com"
          }
        }

        .http file

        GET {{baseUrl}}/foo,
        POST {{baseUrl}}/auth/login 와 같이 변수화 진행할 수 있다.
  • Chrome extension 을 이용해서 Header 값을 설정하는 방법도 있고, Postman, curl을 이용하는 방법도 있음.


profile
CS, 개발 공부기록 🌱

0개의 댓글