From 20a1d9c20b39b7d026c26cfe0df579bd0c94d8db Mon Sep 17 00:00:00 2001 From: jiixon Date: Sat, 13 May 2023 18:58:28 +0900 Subject: [PATCH 1/2] =?UTF-8?q?TEST:=20test=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/itsu/threedays/config/JasyptConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/itsu/threedays/config/JasyptConfig.java b/src/main/java/com/itsu/threedays/config/JasyptConfig.java index 2e7776a..7e5167d 100644 --- a/src/main/java/com/itsu/threedays/config/JasyptConfig.java +++ b/src/main/java/com/itsu/threedays/config/JasyptConfig.java @@ -20,5 +20,6 @@ public StringEncryptor stringEncryptor() { config.setPoolSize("1"); encryptor.setConfig(config); return encryptor; + //test } } From de0dd56437ad7050631bfd85d3775bb168f3c3c5 Mon Sep 17 00:00:00 2001 From: jiixon Date: Sat, 13 May 2023 19:01:22 +0900 Subject: [PATCH 2/2] REFACTOR: JWT TOKEN Configuration --- .../itsu/threedays/config/jwt/JwtFilter.java | 50 ++++++++++ .../config/jwt/JwtTokenProvider.java | 97 +++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 src/main/java/com/itsu/threedays/config/jwt/JwtFilter.java create mode 100644 src/main/java/com/itsu/threedays/config/jwt/JwtTokenProvider.java diff --git a/src/main/java/com/itsu/threedays/config/jwt/JwtFilter.java b/src/main/java/com/itsu/threedays/config/jwt/JwtFilter.java new file mode 100644 index 0000000..d2e4c73 --- /dev/null +++ b/src/main/java/com/itsu/threedays/config/jwt/JwtFilter.java @@ -0,0 +1,50 @@ +package com.itsu.threedays.config.jwt; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@RequiredArgsConstructor +@Slf4j +public class JwtFilter extends OncePerRequestFilter { + private final JwtTokenProvider jwtTokenProvider; + + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + //Request Header에서 토큰 추출 + String jwt = jwtTokenProvider.resolveToken(request); + log.info("jwt filter!"); + log.info("jwt: {}",jwt); + + //Token 유효성 검사 + if (StringUtils.hasText(jwt) && jwtTokenProvider.validateToken(jwt)){ + + //토큰 인증받은 유저인 UsernamePasswordAuthenticiationToken을 리턴 + Authentication auth = jwtTokenProvider.getAuthentication(jwt); + log.info("authentication!"); + + SecurityContextHolder.getContext().setAuthentication(auth); //토큰이 유효한 유저임 -> SecurityContext에 저장 + } + + + filterChain.doFilter(request,response); + } + +// private String resolveToken(HttpServletRequest request){ +// String bearerToken = request.getHeader("authorization"); +// if(StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { +// return bearerToken.substring(7); +// } +// return null; +// } +} diff --git a/src/main/java/com/itsu/threedays/config/jwt/JwtTokenProvider.java b/src/main/java/com/itsu/threedays/config/jwt/JwtTokenProvider.java new file mode 100644 index 0000000..b8ca66a --- /dev/null +++ b/src/main/java/com/itsu/threedays/config/jwt/JwtTokenProvider.java @@ -0,0 +1,97 @@ +package com.itsu.threedays.config.jwt; + +import io.jsonwebtoken.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collection; +import java.util.Date; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class JwtTokenProvider { + @Value("${jwt.secret}") + private String secret; + + @PostConstruct + private void init() { + secret = Base64.getEncoder().encodeToString(secret.getBytes()); + } + + public String createToken(Authentication authentication){ + Date now = new Date(); + Date expiryDate = new Date(now.getTime() + 86400); +// Claims claims = Jwts.claims().setSubject(String.valueOf(authentication.getPrincipal())); +// claims.put("role",authentication.getAuthorities()); + String authorities = authentication.getAuthorities().stream() + .map(GrantedAuthority::getAuthority) + .collect(Collectors.joining(",")); + + + return Jwts.builder() + .setSubject(authentication.getName()) + .claim("auth",authorities) + .setIssuedAt(now) + .setExpiration(expiryDate) + .signWith(SignatureAlgorithm.HS256,secret) + .compact(); + } + //토큰넘버, 만료인증시간(24시간정도),, + + public boolean validateToken(String token) { + try { + Jws claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token); + //토큰의 만료 시간이 현재 시간 이전인지를 확인 -> 만료 시간이 현재 시간 이전이라면 유효하지 않은 토큰으로 판단 + if (claims.getBody().getExpiration().before(new Date())) { + return false; + } + return true; + } catch (JwtException | IllegalArgumentException e) { + return false; + } + } + + // 인증 성공시 SecurityContextHolder에 저장할 Authentication 객체 생성 + public Authentication getAuthentication(String token) { + + Claims claims = Jwts.parserBuilder() + .setSigningKey(secret) + .build() + .parseClaimsJws(token) + .getBody(); + + //클레임에서 권한 정보 가져오기 + Collection authorities = + Arrays.stream(claims.get("auth").toString().split(",")) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + //User 객체를 만들어서 Authentication 리턴 + User principal = new User(claims.getSubject(), "",authorities); + + return new UsernamePasswordAuthenticationToken(principal, token, authorities); + } + public String resolveToken(HttpServletRequest request){ + String bearerToken = request.getHeader("Authorization"); + log.info("bearerToken: {}",bearerToken); + if(StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { //authorization이 Bearer 인지 확인 + + log.info("bearerToken.substring(7) :{}",bearerToken.substring(7)); + return bearerToken.substring(7); + } + + return null; + } +}