Spring Security JWT 임시 토큰으로 필터 테스트

바그다드·2023년 4월 18일
0

Spring Security

목록 보기
14/17
  • 지난 포스팅에서 직접 필터를 생성하여 등록하고 동작하는 것까지 확인해보았다.
    이번에는 임시 토큰을 생성하고 필터 테스트도 해보자!

MyFilter1 수정

package com.pem.jwt.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyFilter1 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String headerAuth = req.getHeader("Authorization");
        System.out.println("headerAuth = " + headerAuth);
        
        System.out.println("필터1");
        // 여기서 response를 이용해 응답을 보내버리면 프로세스가 끝나버리기 때문에
        // 프로세스를 진행하기 위해 다시 필터에 요청과 응답을 넘겨줘야 한다.
        chain.doFilter(req, res);
    }
}
  • request의 http헤더에서 Authorization를 꺼내 출력을 해보자. 아래처럼 당연히 null이 나올것이다.
  • 이제 다시 아래처럼 수정해보자
public class MyFilter1 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;


        // http메서드를 확인하는 메서드
//        System.out.println(req.getMethod());
        if (req.getMethod().equals("POST")) {
            System.out.println("POST요청됨!!");
            String headerAuth = req.getHeader("Authorization");
            System.out.println("headerAuth = " + headerAuth);
        }

        System.out.println("필터1");
        // 여기서 response를 이용해 응답을 보내버리면 프로세스가 끝나버리기 때문에
        // 프로세스를 진행하기 위해 다시 필터에 요청과 응답을 넘겨줘야 한다.
        chain.doFilter(req, res);
    }
}
  • 프로젝트를 다시 시작하고 postman을 이용해 아래처럼 요청을 보내보자
    Authorization = hello만 추가하고 보내면 된다.

    그럼 아래처럼 Authorization값이 출력된다.

  • 그럼 이제 토큰이 생성되었다고 가정하고, 토큰 정보를 이용하여 연결 테스트를 해보자


RestApiController.java 수정

@RestController
public class RestApiController {

    @GetMapping("home")
    public String home() {
        return "<h1>home<h1>";
    }

    @PostMapping("token")
    public String token() {
        return "<h1>token<h1>";
    }
}
  • 토큰값 여부 확인을 위해 token 메서드를 추가해주자

MyFilter1 수정

		// 토큰 = pem
        if (req.getMethod().equals("POST")) {
            System.out.println("POST요청됨!!");
            String headerAuth = req.getHeader("Authorization");
            System.out.println("headerAuth = " + headerAuth);

            if (headerAuth.equals("pem")) {
                chain.doFilter(req, res);
            } else {
                PrintWriter writer = res.getWriter();
                writer.println("인증안됨");
            }
        }
  • if문을 하나 더 추가해 Authorization의 값이 pem일 때만 필터체인으로 연결하고 아닐 시에 '인증안됨'이라는 문자를 출력하고 프로세스틀 종료하도록 설정하였다. 이제 다시 포스트맨으로 테스트해보자.
  • hello로 인증을 하면 인증안됨이 리턴된 것을 확인할 수 있다. 이제 pem을 보내보자

    리턴 값으로 RestApiController의 token메서드의 리턴 값이 뜨는 것을 확인했고,

    콘솔에도 정상적으로 출력되는 것을 확인할 수 있다!!
  • 그런데 이렇게 진행할 경우 위의 사진처럼 일단 필터3와 SecurityFilterChain이 동작하고 난 이후에 MyFilter1이 동작한다. Security가 동작하기 전에 필터에서 걸러낼 수 있도록 MyFilter1의 코드를 MyFilter3로 옮겨주자

MyFilter1 수정

public class MyFilter1 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        System.out.println("필터1");
        chain.doFilter(request, response);
    }
}

MyFilter3 수정

public class MyFilter3 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;


        // http메서드를 확인하는 메서드
//        System.out.println(req.getMethod());
        // 토큰 = pem
        if (req.getMethod().equals("POST")) {
            System.out.println("POST요청됨!!");
            String headerAuth = req.getHeader("Authorization");
            System.out.println("headerAuth = " + headerAuth);

            if (headerAuth.equals("pem")) {
                chain.doFilter(req, res);
            } else {
                PrintWriter writer = res.getWriter();
                writer.println("인증안됨");
            }
        }

        System.out.println("필터3");
        chain.doFilter(request, response);
    }
}
  • 이제 다시 postman으로 요청을 보내면

    security가 실행되기 전에 filter에서 먼저 걸러내는 것을 확인할 수 있다!!!
  • 이것으로 필터를 등록하고 Security가 실행되기 전에 먼저 필터로 걸러내는 것까지 구현하였다. 이제 이 토큰을 생성해주면 된다.
profile
꾸준히 하자!

0개의 댓글