๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

์Šคํ”„๋ง ์ˆ™๋ จ 3์ฃผ์ฐจ : ํ•„ํ„ฐ

KIMHYEYUN 2023. 11. 17. 17:08
๋ฐ˜์‘ํ˜•

ํ•„ํ„ฐ

  • Filter๋ž€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์˜์—ญ์œผ๋กœ Client๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•ด ์ตœ์ดˆ/์ตœ์ข… ๋‹จ๊ณ„์˜ ์œ„์น˜์ด๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • ์ฃผ๋กœ ๋ฒ”์šฉ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊น… ๋ฐ ๋ณด์•ˆ ์ฒ˜๋ฆฌ์— ํ™œ์šฉ
    • ๋˜ํ•œ ์ธ์ฆ, ์ธ๊ฐ€๊ฐ€ ๊ด€๋ จ๋œ ๋กœ์ง๋“ค์„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
    • Filter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ฆ, ์ธ๊ฐ€์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์  ์กด์žฌ

Filter Chain

  • ํ•„ํ„ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ Chain ํ˜•์‹์œผ๋กœ ๋ฌถ์—ฌ์„œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

ํ•„ํ„ฐ ์ ์šฉ

์š”์ฒญ URL์˜ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ ๋ฐ ์ธ์ฆ ์ฒ˜๋ฆฌ ์ง„ํ–‰ํ•˜๋Š” ํ•„ํ„ฐ ๊ตฌํ˜„
์ถ”๊ฐ€๋กœ ์š”์ฒญ URL์„ ๋กœ๊น…ํ•ด์ฃผ๋Š” ํ•„ํ„ฐ ๊ตฌํ˜„

  • Request URL Logging

    @Slf4j(topic = "LoggingFilter")
    @Component
    @Order(1)
    public class LoggingFilter implements Filter {
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
          //์ „์ฒ˜๋ฆฌ
          HttpServletRequest httpServletRequest = (HttpServletRequest) request;
          String url = httpServletRequest.getRequestURI();
          log.info(url);
    
          chain.doFilter(request, response); // ๋‹ค์Œ ํ•„ํ„ฐ๋กœ ์ด๋™
    
          // ํ›„์ฒ˜๋ฆฌ
          log.info("๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์™„๋ฃŒ");
      }
    }
    • @Order(1) : ํ•„ํ„ฐ ์ˆœ์„œ ์ง€์ •
    • chain.doFilter(rquest, response); : ๋‹ค์Œ ํ•„ํ„ฐ๋กœ ์ด๋™
    • log.info("๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์™„๋ฃŒ"); : ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์— client์— ์‘๋‹ต ์ „ ๋กœ๊ทธ๊ฐ€ ์ž‘์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅ
  • AuthFilter : ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ ํ•„ํ„ฐ

    package com.example.springmasterlecture.filter;
    

import com.example.springmasterlecture.entity.User;
import com.example.springmasterlecture.jwt.JwtUtil;
import com.example.springmasterlecture.repository.UserRepository;
import io.jsonwebtoken.Claims;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.io.IOException;

@Slf4j(topic = "AuthFilter")
@Component
@Order(2)
@RequiredArgsConstructor
public class AuthFilter implements Filter {

private final UserRepository userRepository;
private final JwtUtil jwtUtil;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    String url = httpServletRequest.getRequestURI();

    if (StringUtils.hasText(url) && (url.startsWith("/api/user") || url.startsWith("/css") || url.startsWith("/js"))) {
        chain.doFilter(request, response);
    } else {
        String tokenValue = jwtUtil.getTokenFromRequest(httpServletRequest);

        if (StringUtils.hasText(tokenValue)) {
            String token = jwtUtil.substringToken(tokenValue);

            if (!jwtUtil.validateToken(token)) {
                throw new IllegalArgumentException("Token Error");
            }

            Claims info = jwtUtil.getUserInfoFromToken(token);

            User user = userRepository.findByUsername(info.getSubject()).orElseThrow(
                    () -> new NullPointerException("Not Found User")
            );

            request.setAttribute("user", user);
            chain.doFilter(request, response);
        } else {
            throw new IllegalArgumentException("Not Found Token");
        }
    }
}

}

    - `httpServletRequest.getRequestURI()` : ์š”์ฒญ URL์„ ๊ฐ€์ ธ์™€์„œ ๊ตฌ๋ถ„ (์ธ๊ฐ€)
        - `/api/user`, `/css`, `/js` ๋กœ ์‹œ์ž‘ํ•˜๋Š” url์€ ์ธ์ฆ ์ฒ˜๋ฆฌ์—์„œ ์ œ์™ธ
    - ๊ทธ ์™ธ url์€ ์ธ์ฆ ์ฒ˜๋ฆฌ ์ง„ํ–‰
        - `jwtUtil.getTokenFromRequest(httpServletRequest)`
            - `httpServletRequest` ์—์„œ ์ฟ ํ‚ค ๋ชฉ๋ก์„ ๊ฐ€์ ธ์™€ JWT๊ฐ€ ์ €์žฅ๋œ ์ฟ ํ‚ค ์ฐพ์Œ
        - tokenValue๊ฐ€ ์กด์žฌํ•˜๋ฉด ํ† ํฐ ํŒŒ์‹ฑ, ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ด
        - ๊ฐ€์ ธ์˜จ ์‚ฌ์šฉ์ž username์„ ์‚ฌ์šฉํ•ด์„œ DB์— ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์กด์žฌํ•˜๋ฉด ์ธ์ฆ ์™„๋ฃŒ
        - ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ Controller API์— ์ธ์ฆ ์™„๋ฃŒ๋œ User ๊ฐ์ฒด ์ „๋‹ฌ
728x90
๋ฐ˜์‘ํ˜•