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
'Spring Security' 카테고리의 다른 글
Spring Security - OAuth2 인증(Authentication) (0) | 2022.07.31 |
---|---|
Spring Security - Filter & FilterChain (0) | 2022.07.30 |
Spring Security - JWT 로그인 (0) | 2022.07.28 |
Spring Security - JWT 인증(Authentication) (0) | 2022.07.27 |
Spring Security - 개요 (0) | 2022.07.22 |