728x90
Gateway에서 인가 처리
JwtFilter
spring cloud gateway에서 제공해주는 AbstractGatewayFilterFactory 필터를 사용해줘야 한다.
import com.example.apigateway.utils.JwtUtil;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
@Component
public class JwtFilter extends AbstractGatewayFilterFactory<JwtFilter.Config> {
public static class Config {}
public JwtFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (((exchange, chain) -> {
System.out.println("JwtFilter 실행됨");
System.out.println(JwtUtil.generateToken(1L, "test01@test.com", "ROLE_USER"));
// 토큰 확인하는 기능
ServerHttpRequest request = exchange.getRequest(); // 사용자 요청 받아오기
HttpCookie cookie = request.getCookies().getFirst("ATOKEN"); // 토큰 받아오기
// 쿠키가 없으면 실패 처리
if(cookie == null) {
return exchange.getResponse().setComplete();
}
String token = cookie.getValue();
if (!JwtUtil.validate(token)) {
// 실패 처리
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}));
}
}
application.yml 설정
원하는 path의 아래에다가 filter를 등록해준다.
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: api-board
uri: lb://api-board
predicates:
- Path=/board/**
filters:
- JwtFilter
사용자 정보 담기
JwtFilter
토큰에서 유저의 idx와 email을 받아와서 header에 세팅한다.
// 토큰에서 idx와 email을 받아와서 header에 세팅
ServerHttpRequest newRequest = exchange.getRequest().mutate()
.header("X-User-Idx", String.valueOf(JwtUtil.getUserIdx(token)))
.header("X-User-Email", JwtUtil.getUserEmail(token))
.build();
ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
return chain.filter(newExchange);
JwtUtil
토큰을 받아와서 idx와 email을 반환해주는 메소드 작성
public static Long getUserIdx(String token) {
return Jwts.parserBuilder()
.setSigningKey(SECRET)
.build()
.parseClaimsJws(token)
.getBody().get("userIdx", Long.class);
}
public static String getUserEmail(String token) {
return Jwts.parserBuilder()
.setSigningKey(SECRET)
.build()
.parseClaimsJws(token)
.getBody().get("userEmail", String.class);
}
728x90
'BE > Spring Boot' 카테고리의 다른 글
[Spring Boot] 로그(Logging) (0) | 2025.03.29 |
---|---|
[Spring Boot] CQRS (0) | 2025.03.29 |
[Spring Boot] Eureka란? / 스프링 부트에서 Eureka, Gateway 설정 (0) | 2025.03.19 |
[Spring Boot] 멀티 모듈 프로젝트 생성 / API Gateway 연결 (0) | 2025.03.18 |
[Spring Boot] Spring Cloud란? / Spring Cloud Gateway (0) | 2025.03.18 |
728x90
Gateway에서 인가 처리
JwtFilter
spring cloud gateway에서 제공해주는 AbstractGatewayFilterFactory 필터를 사용해줘야 한다.
import com.example.apigateway.utils.JwtUtil; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.http.HttpCookie; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; @Component public class JwtFilter extends AbstractGatewayFilterFactory<JwtFilter.Config> { public static class Config {} public JwtFilter() { super(Config.class); } @Override public GatewayFilter apply(Config config) { return (((exchange, chain) -> { System.out.println("JwtFilter 실행됨"); System.out.println(JwtUtil.generateToken(1L, "test01@test.com", "ROLE_USER")); // 토큰 확인하는 기능 ServerHttpRequest request = exchange.getRequest(); // 사용자 요청 받아오기 HttpCookie cookie = request.getCookies().getFirst("ATOKEN"); // 토큰 받아오기 // 쿠키가 없으면 실패 처리 if(cookie == null) { return exchange.getResponse().setComplete(); } String token = cookie.getValue(); if (!JwtUtil.validate(token)) { // 실패 처리 return exchange.getResponse().setComplete(); } return chain.filter(exchange); })); } }
application.yml 설정
원하는 path의 아래에다가 filter를 등록해준다.
spring: application: name: api-gateway cloud: gateway: routes: - id: api-board uri: lb://api-board predicates: - Path=/board/** filters: - JwtFilter
사용자 정보 담기
JwtFilter
토큰에서 유저의 idx와 email을 받아와서 header에 세팅한다.
// 토큰에서 idx와 email을 받아와서 header에 세팅 ServerHttpRequest newRequest = exchange.getRequest().mutate() .header("X-User-Idx", String.valueOf(JwtUtil.getUserIdx(token))) .header("X-User-Email", JwtUtil.getUserEmail(token)) .build(); ServerWebExchange newExchange = exchange.mutate().request(newRequest).build(); return chain.filter(newExchange);
JwtUtil
토큰을 받아와서 idx와 email을 반환해주는 메소드 작성
public static Long getUserIdx(String token) { return Jwts.parserBuilder() .setSigningKey(SECRET) .build() .parseClaimsJws(token) .getBody().get("userIdx", Long.class); } public static String getUserEmail(String token) { return Jwts.parserBuilder() .setSigningKey(SECRET) .build() .parseClaimsJws(token) .getBody().get("userEmail", String.class); }
728x90
'BE > Spring Boot' 카테고리의 다른 글
[Spring Boot] 로그(Logging) (0) | 2025.03.29 |
---|---|
[Spring Boot] CQRS (0) | 2025.03.29 |
[Spring Boot] Eureka란? / 스프링 부트에서 Eureka, Gateway 설정 (0) | 2025.03.19 |
[Spring Boot] 멀티 모듈 프로젝트 생성 / API Gateway 연결 (0) | 2025.03.18 |
[Spring Boot] Spring Cloud란? / Spring Cloud Gateway (0) | 2025.03.18 |