1. 인증 방식

 1) Session & Cookie 인증 방식

 

  • 사용자가 로그인 요청을 보내면 사용자를 확인 후 Session ID를 발급한다
  • 발급한 ID를 이용해 다른 요청과 응답을 처리하는 방식이다
  • 쿠키 인증은 쿠키에 사용자 정보를 담아 서버로 보내게 되는데 HTTP 방식 통신을 사용하는 경우 정보가 유출되기 쉽다
  • 세션 인증은 세션 ID를 보내므로 쿠키에 비해 보안성이 높지만 서버에서 처리를 해야하기 때문에 추가적인 데이터베이스 공간이 필요하므로 점점 커지면 부담이 될 수 있다

 

 2) Token 인증 방식

 

  • 저장소의 필요 없이 로그인 시 토큰을 발급한다
  • 데이터 요청 시에 발급받은 토큰을 헤더를 통해 전달하여 응답 받는 방식이다
  • 쿠키나 세션을 이용한 인증보다 보안성이 강하고 효율적인 인증 방법이다
  • 토큰은 데이터가 인코딩 되어 있어 누구나 디코딩하여 데이터가 유출될 수 있지만 서명 필드가 헤더와 페이로드를 통해 만들어져 데이터 변조 후 재전송을 막을 수 있다
  • statelsess 서버를 만들 수 있다
  • 인증정보를 OAuth로 이용할 수 있다
  • 일반적으로 토큰은 요청 헤더의 Authorization 필드에 담겨져 보내지게 된다
요청 헤더의 Authorization 필드 구조
Authorization: <type> <credentials>

 

 

2. Bearer 인증 테스트

  • Bearer 인증은 JWT or OAuth에 대한 토큰을 사용한다
  • 기초 환경 설정 코드를 작성한 token 폴더를 오픈한다

 1) Filter 생성

  • filter 패키지를 만들고 FirstFilter 클래스를 생성한다
package com.json.token.filter;

import javax.servlet.*;
import java.io.IOException;

public class FirstFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FirstFilter");
    }
}

 

 

  • SecurityConfig 클래스에 코드를 추가한다
    - addFilterBefore() 또는 addFilterAfter()를 사용해서 특정 필터 전/후로 적용될 수 있게 한다
    http.addFilterBefore(new FirstFilter(), BasicAuthenticationFilter.class); // 추가

 

 2) Token 적용

  • FirstFilter 클래스에 코드를 추가한다
    - HttpServletRequest
     : ServletRequest를 상속한다
     : Http 프로토콜의 request 정보를 서블릿에 전달하기 위한 목적으로 사용한다
     : Header 정보, Parameter, cookie, URI, URL 등의 정보를 읽어들이는 메서드를 가진 클래스이다
     : Body의 Stream을 읽어들이는 메서드를 가지고 있다

    - HttpServletResponse
     : ServletResponse를 상속한다
     : Servlet이 HttpServletResponse 객체에 Content Type, 응답코드, 응답 메세지 등을 담아서 전송한다

    - HttpServlerRequest, HttpServletResponse 는 http 요청을 할 때 요청 정보가 해당 객체에 있기 때문에 사용한다
package com.json.token.filter;

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

public class FirstFilter implements Filter {

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

        //System.out.println("FirstFilter");

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

        res.setCharacterEncoding("UTF-8");
        if(req.getMethod().equals("POST")) {
            String headerAuth = req.getHeader("Authorization");

            if(headerAuth.equals("codestates")) {
                chain.doFilter(req, res);
            } else {
                PrintWriter writer = res.getWriter();
                writer.println("인증 실패");
            }
        }
    }
}

 

  • POST 테스트를 위해 RestApiController 클래스에 코드를 추가한다
    @PostMapping("/token")
    public String token() {
        return "<h1>token</h1>";
    }

 

3. 테스트

 1) postman 에 http://localhost:8080/token 으로 POST 요청을 한다

  • FirstFilter 클래스에 작성한 KEY : Authorization 와 VALUE : codestates 를 입력하고 전송한다
  • 'token' 값을 전송받는다

 2) postman 에 http://localhost:8080/token 으로 POST 요청을 한다

  • 임의의 KEY : Authorization 와 VALUE : kim 를 입력하고 전송한다
  • 허용하지 않은 값으로 Authorization이 올 경우에는 '인증 실패' 값을 전송받는다

 

4. 토큰 처리

  • ID, Password가 정상적으로 들어와 로그인이 완료되면 토큰을 만들어주고 응답으로 넘겨 준다
  • 이후 요청이 올 때 header에 Authorization에 있는 토큰 값만 가져와서 확인한다
  • 넘어온 토큰이 우리가 발행한 토큰이 맞는지만 검증하면 된다

 

※ 참조 링크 

▶ 필터 이해하기 : https://atin.tistory.com/590

 

[Spring Security] 필터 Filter, SecurityFilterChain 이해하기

Spring Security를 커스터마이징하기 위해서는 그리고 이해하기 위해서는 아래 필터 체인을 이해하는 것이 좋다. 아래 그림은 인터넷에 돌아다니는 Spring Security 호출 그림을 내가 다시 깔끔하게 그

atin.tistory.com

 

+ Recent posts