Spring - JWT, Filter

김상엽·2024년 1월 31일
0

Spring

목록 보기
9/26
post-thumbnail

TIL

JWT

  • JWT(Json Web Token)란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token 이다.
  • 즉, 토큰의 한 종류이다. 일반적으로 쿠키 저장소를 사용하여 JWT를 저장한다.

JWT를 사용하는 이유

1. 서버가 1대인 경우

  • Session1 이 모든 Client의 로그인 정보를 소유하고 있다.

2. 서버가 2대 이상인 경우

  • Session 마다 다른 Client 로그인 정보를 가지고 있을 수 있다.
    • Client의 로그인 정보를 가지고 있지 않은 Server에 API 요청을 하면 오류 발생!
  • 해결방법
    • Client 마다 요청 Server 고정한다.(Sticky Session)
    • 세션 저장소를 생성하여 모든 세션을 저장한다.

3. 세션 저장소 생성

  • 세션 저장소가 모든 Client 의 로그인 정보 소유하고 있기 때문에 모든 서버에서 모든 Client의 API 요청을 처리할 수 있다.

4. JWT 사용

  • 로그인 정보를 Server 에 저장하지 않고, Client 에 로그인 정보를 JWT 로 암호화하여 저장한다.
    • JWT 통해 인증/인가
  • 모든 서버에서 동일한 Secret Key를 소유한다.

JWT의 장점

  • 동시 접속자가 많을 때 서버 측 부하 낮훈다.( 접속자가 많을수록 세션저장소 부하 증가)
  • Client, Sever 가 다른 도메인을 사용할 때
    • 예) 카카오 OAuth2 로그인 시 JWT Token 사용

JWT의 단점

  • 구현의 복잡도 증가한다.
  • JWT 에 담는 내용이 커질 수록 네트워크 비용 증가한다. (클라이언트 → 서버)
  • 이미 생성된 JWT를 일부만 만료시킬 방법이 없다.
  • Secret key 유출 시 JWT을 조작할 수 있다.

JWT 흐름도

  • 1. Client 가 username, password 로 로그인 성공 시
    • 서버에서 "로그인 정보" → JWT 로 암호화 (Secret Key 사용)
    • 서버에서 직접 쿠키를 생성해 JWT를 담아 Client 응답에 전달한다.
Cookie cookie = new Cookie(AUTHORIZATION_HEADER, token); // Name-Value
cookie.setPath("/");
// Response 객체에 Cookie 추가
res.addCookie(cookie);
  • 2. Client 에서 JWT 통해 인증시
    • 서버에서 API 요청 시마다 쿠키에 포함된 JWT를 찾아서 사용한다.
// HttpServletRequest 에서 Cookie Value : JWT 가져오기
public String getTokenFromRequest(HttpServletRequest req) {
    Cookie[] cookies = req.getCookies();
    if(cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals(AUTHORIZATION_HEADER)) {
                try {
                    return URLDecoder.decode(cookie.getValue(), "UTF-8"); // Encode 되어 넘어간 Value 다시 Decode
                } catch (UnsupportedEncodingException e) {
                    return null;
                }
            }
        }
    }
    return null;
}
    1. Client 가 전달한 JWT 위조 여부를 검증한다. (Secret Key 사용)
    1. JWT 유효기간이 지나지 않았는지 검증한다.
    1. 검증 성공시, JWT에서 사용자 정보를 가져와 확인한다.

Filter

  • Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치이며 이를 통해 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가할 수 있다.
  • 주로 범용적으로 처리해야 하는 작업들, 예를들어 로깅 및 보안 처리에 활용한다.
    • 인증, 인가와 관련된 로직들을 처리할 수도 있다.
    • Filter를 사용하면 인증, 인가와 관련된 로직을 비즈니스 로직과 분리하여 관리할 수 있다는 장점이 있다.

FilterChain

  • Filter는 한 개만 존재하는 것이 아니라 여러 개가 Chain 형식으로 묶여서 처리될 수 있다.
    • @Order(1) 로 필터의 순서를 지정한다.
    • chain.doFilter(request, response); 다음 Filter로 이동시킨다.

오늘의 회고

로그인쪽이 이렇게나 다양하게 복잡할 줄은 몰랐다. 갑자기 구조가 엄청나게 추가되서 일단 강의를 다 듣고 개인과제를 구현해보면서 구조를 익히는 쪽으로 해보려고 한다.

profile
개발하는 기록자

0개의 댓글