ํํฐ
- 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 ๊ฐ์ฒด ์ ๋ฌ
'๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[KPT] ๋ด์คํผ๋ ํ๋ก์ ํธ (0) | 2023.11.28 |
---|---|
์คํ๋ง ์๋ จ 3์ฃผ์ฐจ : Spring Security (1) | 2023.11.17 |
์คํ๋ง ์๋ จ 3์ฃผ์ฐจ : JWT (0) | 2023.11.17 |
์คํ๋ง ์๋ จ 3์ฃผ์ฐจ : ์ฟ ํค์ ์ธ์ (1) | 2023.11.17 |
์คํ๋ง ์๋ จ 3์ฃผ์ฐจ : ์ธ์ฆ๊ณผ ์ธ๊ฐ (0) | 2023.11.09 |