빅데이터 Java 개발자 교육 [Spring - (JwtFilter (토큰필터))]

Jun_Gyu·2023년 5월 17일
0
post-thumbnail

오늘은 어제 수업에 이어서 회원가입 기능에서도 토큰을 이용하여 기능을 수행해보도록 하겠다.

먼저 토큰 정보를 받아 검증을 거쳐 기존 정보를 받아오고 데이터를 수정할 수 있도록
Rest컨트롤러의 회원가입 @PostMapping 어노테이션을 수정하겠다.

RestStudent2Controller

회원가입 @PostMapping

@PostMapping(value = "/update.json")
    public Map<String, Object> updatePOST(@RequestHeader(name = "token") String token,
                @ModelAttribute Student2 obj) {
        Map<String, Object> retMap = new HashMap<>();
        try {

            // 1. 토큰을 받아서 출력
            log.info("{}", token);
            log.info("{}", obj.toString());

            // 2. 실패시 전달값
            retMap.put("status", 0);

            // 3. 토큰을 검증
            Student2 obj1 = jwtUtil2.checkJwt(token);
            if ( obj1 != null ) {
                // 1. 이메일을 이용해서 기존 데이터 가져오기
                Student2 obj2 = s2Repository.findById( obj1.getEmail() ).orElse(null);

                // 2. obj2에 필요한 정보 저장하기
                obj2.setName( obj.getName() );
                obj2.setPhone(obj.getPhone() );

                // 3. obj2를 다시 저장하기 
                s2Repository.save(obj2);
                retMap.put("status", 200);
            }

        } catch (Exception e) {
            e.printStackTrace();
            retMap.put("status", -1);
            retMap.put("error", e.getMessage());
        }
        return retMap;
    }

이제 세부적인 오류상황을 가정하여 토큰값이 올바른 상황에만 컨트롤러로 전송되도록 Filter를 구성해보도록 하자.

JwlFilter2

@Component
@RequiredArgsConstructor
public class JwtFilter2 extends OncePerRequestFilter {

    final JwtUtil2 jwtUtil2;
    ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        try {
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, Object> retMap = new HashMap<>();


            String token = request.getHeader("token");
            if ( token == null ) { // 토큰 키 자체가 없을때
                // 못가게 함 + 오류메세지 출력
                retMap.put("status", -1);
                retMap.put("message", "token null");
                String result = objectMapper.writeValueAsString(retMap);
                response.getWriter().write(result);

                return; // 메소드 종료
            }
            
            if ( token.length() <= 0 ) { // 전송은 되었으나 토큰내용이 누락되었을 때
                retMap.put("status", -1);
                retMap.put("message", "token is empty");
                String result = objectMapper.writeValueAsString(retMap);
                response.getWriter().write(result);
                // 역시 내용이 없기때문에 못가게함 + 

                return; // 메소드 종료
            }
            
            Student2 obj = jwtUtil2.checkJwt(token);
            if( obj == null ) { // 토큰 전송이후 student2 객체값이 반환되지 않았을 때
                retMap.put("status", -1);
                retMap.put("message", "token error");
                String result = objectMapper.writeValueAsString(retMap);
                response.getWriter().write(result);

                return; // 메소드 종료
            }

            // 아래의 명령어가 실행되어야 정상적인 컨트롤러로 진입 가능.
            filterChain.doFilter(request, response);

        } catch (Exception e) {
            e.printStackTrace();
            response.sendError(-1, "token error");
        }
    }

}

OncePerRequestFilter 클래스를 상속받아 기능을 생성하였다.

각각의 조건문에서는 token이 누락되거나, 객체값이 반환되지 않았을때 오류를 출력하도록 코드를 구성하였다.


하지만 위의 Filter의 경우에는 적용되는 범위를 따로 지정해주지 않은 상태이다.

사용하고자 하는 url경로를 직접 설정해주고자 Config파일도 같이 생성해주었다.

FiltlerConfig

@Configuration
@Slf4j
public class FilterConfig {
    
    @Bean //서버가 구동될때 자동으로 호출됨
    // JwtFilter2필터가 적용되는 url을 설정
    public FilterRegistrationBean<JwtFilter2> filterRegistrationBean(JwtFilter2 jwtFilter){
        log.info("filter => {}" , "filterConfig");
        FilterRegistrationBean<JwtFilter2> filterReg = new FilterRegistrationBean<>();
        filterReg.setFilter(jwtFilter);
        filterReg.addUrlPatterns("/api/student2/update.json");
        filterReg.addUrlPatterns("/api/student2/delete.json");
        return filterReg;
    }


    @Bean //서버가 구동될때 자동으로 호출됨
    // JwtFilter2필터가 적용되는 url을 설정
    public FilterRegistrationBean<UrlFilter> filterRegistrationBean1(UrlFilter jwtFilter){
        log.info("filter => {}" , "filterConfig");
        FilterRegistrationBean<UrlFilter> filterReg = new FilterRegistrationBean<>();
        filterReg.setFilter(jwtFilter);
        filterReg.addUrlPatterns("/api/student2/*"); // * 은 전체 url (만들기만하면 기본설정됨.)
        return filterReg;
    }
}
profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글