본문 바로가기
Back-end/JAVA

[JAVA] Spring으로 REST API 구현하기 (2) - Interceptor

by 허도치 2019. 12. 5.

2019/12/05 - [Back-end/JAVA] - [JAVA] Spring으로 REST API 구현하기 (1) - 프로젝트 생성 및 실행

 

  이번 포스트에서는 secretKey를 가진 유저만 접속할 수 있도록 검증하고 차단하는 Interceptor를 만들어보도록 하겠다. 인증키방식은 키를 가진 유저라면 누구나 서버에 접속할 수 있기 때문에 안전한 방법은 아니지만, 가장 간단하게 구현할 수 있는 방법이기 때문에 이번 포스트에서는 인증키 방식으로 구현해보도록 하겠다.

 

 

1. Interceptor 작성.

   1-1. AuthInterceptor.java 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.dochi.prj.config.interceptors;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
@Component
public class AuthInterceptor extends HandlerInterceptorAdapter {
    
    private static final Logger logger = LoggerFactory.getLogger(AuthInterceptor.class);
    
    @Value("${auth.secretKey}")
    private String secretKey;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("Pre Interceptor {}", request.getContextPath());
        
        String userSecretKey = request.getParameter("secretKey");
        if( userSecretKey != null && userSecretKey.equals( secretKey ) ) {
            return true;
        } else {
           //response.sendRedirect(request.getContextPath()+"err/999");
            return false;
        }
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("Post Interceptor");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        logger.info("After Interceptor");
    }
}
 
cs

         - 14 ln: Spring Boot Web에서 제공하는 Interceptor Class를 상속.

         - 18~19 ln: application.yml에 정의한 값을 변수에 Injection, " auth.secretKey = ABCDE "

         - 23~32 ln: Request가 들어왔을 때 실행되는 Interceptor이며 true를 반환하면 요청한 url로 넘어가고, false로 를 반환하면 요청이 중단됨. 그래서, sendRedirect를 통해 오류 페이지로 넘겨주는데 테스트를 위해 redirect를 주석처리하고 실행해보자.

         - 35~37 ln: Request를 처리한 후 Response되기 전에 실행되는 Interceptor.

         - 40~43 ln: Request가 종료될 때 실행되는 Interceptor.

 

 

2. Interceptor 설정.

   2-1. WebConfiguration 설정.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.dochi.prj.config;
 
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
import com.dochi.prj.config.interceptors.AuthInterceptor;
 
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
 
    private static final Logger logger = LoggerFactory.getLogger(WebConfiguration.class);
    
    @Autowired
    private AuthInterceptor interceptor; 
 
    @Override 
public void addInterceptors(InterceptorRegistry registry) {
        logger.info("Set Interceptor {}", interceptor.getClass());
        
        List<String> excludeList = new ArrayList<String>();
        excludeList.add("/admin/**");
        excludeList.add("/err/**");        
        
        registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns(excludeList);
    }
}
 
cs

         - 14 ln: Java 설정을 위한 어노테이션.

         - 20 ln: 위에서 생성한 Interceptor를 Injection.

         - 30 ln: Interceptor를 처리할 URI 패턴지정.

 

 

3. 마치며.

   - 위와같이 설정한 후 테스트를 해보면 secretKey가 없거나 일치하지 않는 경우에는 반응이 없거나 redirect를 처리한 경우에는 그에 따른 결과값을 얻을 수 있다. 

   - secretKey를 암호화하지 않아서 전혀 안전해보이지 않는다. 나중에 암호화 모듈을 달아서 개선을 해보도록 하자.

   - 간단하게 Interceptor를 구현해보았다. 다음 포스트에서는 Exception Handler를 만들어 보자.

 

댓글