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를 만들어 보자.
'Back-end > JAVA' 카테고리의 다른 글
[Replace] 확장된 Replace로 첫 글자만 대문자로 치환 (0) | 2020.02.19 |
---|---|
[JAVA] Spring으로 REST API 구현하기 (5) - Filter (0) | 2019.12.11 |
[JAVA] Spring으로 REST API 구현하기 (4) - ControllerAdvice (0) | 2019.12.05 |
[JAVA] Spring으로 REST API 구현하기 (3) - Error Controller (0) | 2019.12.05 |
[JAVA] Spring으로 REST API 구현하기 (1) - 프로젝트 생성 및 실행 (4) | 2019.12.05 |
댓글