Class DefaultJwtAuthenticationProviderImpl

java.lang.Object
com.jerocaller.libs.spoonsuits.web.jwt.impl.DefaultJwtAuthenticationProviderImpl
All Implemented Interfaces:
JwtAuthenticationProvider

@Component @Order(2147483647) public class DefaultJwtAuthenticationProviderImpl extends Object implements JwtAuthenticationProvider

JwtAuthenticationProvider의 기본 구현체

application.yml(또는 .properties)의 프로퍼티 값들을 필드들에 바인딩한 JwtProperties 객체를 이용함

  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected final JwtProperties
     
    protected Key
     

    Fields inherited from interface com.jerocaller.libs.spoonsuits.web.jwt.JwtAuthenticationProvider

    AUTHORIZATION, BEARER
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    createAccessToken(org.springframework.security.core.userdetails.UserDetails user)
    유저 정보를 통해 Access token을 생성하는 메서드.
    createRefreshToken(org.springframework.security.core.userdetails.UserDetails user)
    유저 정보를 통해 Refresh token을 생성, 반환하는 메서드
    createToken(org.springframework.security.core.userdetails.UserDetails user, long expirationInMilliSeconds)
    JWT 토큰 생성 메서드
    io.jsonwebtoken.Claims
    JWT로부터 모든 클레임들을 추출하기 위한 메서드.
    JWT의 subject에 username이 있는 경우 이를 통해 username을 추출하는 메서드.
    org.springframework.security.core.Authentication
    SecurityContextHolder에 JWT 토큰으로부터 얻은 사용자 정보를 Authentication 타입으로 저장하기 위해 JWT 토큰으로부터 추출한 사용자 정보를 Authentication 객체로 반환하는 메서드.
    void
    JWT secret key 생성
    resolveToken(jakarta.servlet.http.HttpServletRequest request)
    HTTP request의 header Authorization: Bearer 에 담긴 JWT를 추출, 반환
    resolveTokenInCookie(jakarta.servlet.http.HttpServletRequest request, String cookieName)
    쿠키에 JWT를 담은 경우, 해당 쿠키로부터 JWT를 추출, 반환하는 메서드.
    boolean
    JWT 토큰 유효성 검사 메서드.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • jwtProperties

      protected final JwtProperties jwtProperties
    • secretKey

      protected Key secretKey
  • Constructor Details

    • DefaultJwtAuthenticationProviderImpl

      public DefaultJwtAuthenticationProviderImpl()
  • Method Details

    • init

      @PostConstruct public void init()

      JWT secret key 생성

    • createToken

      public String createToken(org.springframework.security.core.userdetails.UserDetails user, long expirationInMilliSeconds)

      JWT 토큰 생성 메서드

      JWT 생성 구조)

      
       return Jwts.builder()
           .header()
           .type("JWT")
           .and()
           .subject(user.getUsername())
           .claims(roles)
           .issuedAt(new Date())
           .issuer(jwtProperties.getIssuer())
        // expiration = new java.util.Date(System.currentTimeMillis() + expirationInMilliSeconds)
           .expiration(expiration)
           .signWith(secretKey)
           .compact();
       
      • rolesList<String> 타입.
      • subject에 username이 들어가 extractUsernameFromToken(String) 메서드를 이용하여 손쉽게 username을 추출할 수 있음.
      Specified by:
      createToken in interface JwtAuthenticationProvider
      Parameters:
      user - 사용자 정보가 담긴 UserDetails 구현체
      expirationInMilliSeconds - JWT 만료 시간(ms)
      Returns:
      생성된 JWT 토큰
      See Also:
    • resolveToken

      public String resolveToken(jakarta.servlet.http.HttpServletRequest request)

      HTTP request의 header Authorization: Bearer 에 담긴 JWT를 추출, 반환

      쿠키를 이용하여 JWT를 운용하는 경우, 쿠키로부터 JWT값을 추출하고자 한다면 resolveTokenInCookie(HttpServletRequest, String)를 사용하면 된다.

      Specified by:
      resolveToken in interface JwtAuthenticationProvider
      Parameters:
      request -
      Returns:
      JWT 토큰
    • validateToken

      public boolean validateToken(String token)

      JWT 토큰 유효성 검사 메서드.

      토큰의 만료 여부, 토큰 변조 여부 등으로 발생하는 예외는 별도로 처리하지 않고 한꺼번에 false로 처리하기에, 각 상황에 따른 예외 처리를 하고자 한다면 이 메서드를 오버라이딩하여 별도로 구현해야 함.

      Specified by:
      validateToken in interface JwtAuthenticationProvider
      Parameters:
      token -
      Returns:
      유효 시 true, 만료 등의 이유로 유효하지 않으면 false
    • getAuthentication

      public org.springframework.security.core.Authentication getAuthentication(String token)

      SecurityContextHolder에 JWT 토큰으로부터 얻은 사용자 정보를 Authentication 타입으로 저장하기 위해 JWT 토큰으로부터 추출한 사용자 정보를 Authentication 객체로 반환하는 메서드.

      principal에는 String 타입의 username을 넣도록 함. 따라서 Authentication.getPrincipal()의 반환값도 String 타입이다.

      Specified by:
      getAuthentication in interface JwtAuthenticationProvider
      Parameters:
      token -
      Returns:
    • createAccessToken

      public String createAccessToken(org.springframework.security.core.userdetails.UserDetails user)

      유저 정보를 통해 Access token을 생성하는 메서드.

      내부적으로 createToken(UserDetails, long)을 호출하여 토큰을 생성하며, 토큰 만료 기간은 JwtProperties와 매핑되는 application.yml(.properties) 의 jwt.token.access.expiry의 값으로 함.

      Specified by:
      createAccessToken in interface JwtAuthenticationProvider
      Parameters:
      user -
      Returns:
      See Also:
    • createRefreshToken

      public String createRefreshToken(org.springframework.security.core.userdetails.UserDetails user)

      유저 정보를 통해 Refresh token을 생성, 반환하는 메서드

      내부적으로 createToken(UserDetails, long)을 호출하여 토큰을 생성하며, 토큰 만료 기간은 JwtProperties와 매핑되는 application.yml(.properties) 의 jwt.token.refresh.expiry의 값으로 함.

      Specified by:
      createRefreshToken in interface JwtAuthenticationProvider
      Parameters:
      user -
      Returns:
      See Also:
    • resolveTokenInCookie

      public String resolveTokenInCookie(jakarta.servlet.http.HttpServletRequest request, String cookieName)

      쿠키에 JWT를 담은 경우, 해당 쿠키로부터 JWT를 추출, 반환하는 메서드.

      Specified by:
      resolveTokenInCookie in interface JwtAuthenticationProvider
      Parameters:
      request -
      cookieName - JWT가 담긴 쿠키 이름
      Returns:
    • extractClaims

      public io.jsonwebtoken.Claims extractClaims(String token)
      Description copied from interface: JwtAuthenticationProvider

      JWT로부터 모든 클레임들을 추출하기 위한 메서드.

      Specified by:
      extractClaims in interface JwtAuthenticationProvider
      Parameters:
      token - 추출하고자 하는 JWT 토큰
      Returns:
      추출된 모든 클레임
    • extractUsernameFromToken

      public String extractUsernameFromToken(String token)

      JWT의 subject에 username이 있는 경우 이를 통해 username을 추출하는 메서드.

      Specified by:
      extractUsernameFromToken in interface JwtAuthenticationProvider
      Parameters:
      token - username을 추출하고자 하는 JWT 토큰
      Returns:
      username