티스토리 뷰

 

이어서 계속 구현해보겠습니다.

 

구현 자체가 목적이므로 자세한 설명을 생략합니다.

 

  1. JWT 생성하기
  2. JWT에 권한 추가해주기 (진행)
  3. 생성한 JWT에 대해 인증/인가 하기
  4. JWT 재발급 해주기

구현

 

@Component
class JwtProvider(
    private val memberRepository: MemberRepository
) {

    companion object {
        private const val AUTHORITIES_KEY = "auth"
        private const val BEARER_TYPE = "bearer"
        private const val ACCESS_TOKEN_EXPIRE_TIME = (1000 * 60 * 30)
        private const val REFRESH_TOKEN_EXPIRE_TIME = (1000 * 60 * 60 * 24 * 7)
    }

    private val key: Key by lazy {
        val secretKey: String = "ZVc3Z0g4bm5TVzRQUDJxUXBIOGRBUGtjRVg2WDl0dzVYVkMyWWs1Qlk3NkZBOXh1UzNoRWUzeTd6cVdEa0x2eQo=" // base64Encoded
        Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretKey))
    }

    fun generateJwtDto(oAuth2User: OAuth2User) : JwtDto {
        val now = Date().time
        val accessTokenExpiresIn: Date = Date(now + ACCESS_TOKEN_EXPIRE_TIME)

        val member = memberRepository.findByEmail(oAuth2User.attributes["email"] as String)

        val accessToken = Jwts.builder()
            .setSubject(member?.email) // payload "sub": "email"
            .claim(AUTHORITIES_KEY, member?.role)  // payload "auth": "ROLE_USER"
            .setExpiration(accessTokenExpiresIn) // payload "exp": 1516239022 (예시)
            .signWith(key, SignatureAlgorithm.HS512) // header "alg": "HS512"
            .compact()

        val refreshToken = Jwts.builder()
            .setSubject(member?.email)
            .setExpiration(Date(now + REFRESH_TOKEN_EXPIRE_TIME))
            .signWith(key, SignatureAlgorithm.HS512)
            .compact()

        return JwtDto(
            grantType = BEARER_TYPE,
            accessToken = accessToken,
            refreshToken = refreshToken,
            accessTokenExpiresIn = accessTokenExpiresIn.time
        )
    }
}

 

JWT 의 payload 부분에 auth 만 추가해주었습니다.

권한은 DB에 저장한 회원 정보를 가져와서 담게 됩니다. 

 


실행

1. http://localhost:8080/oauth2/authorization/google 로 접속 후, 계정을 선택합니다.

2. JWT를 부여받습니다.

 

 

3. https://jwt.io/ 에서 확인해봅니다.

 

payload 부분에 auth가 추가된 것을 볼 수 있습니다.

 

  1. JWT 생성하기
  2. JWT에 권한 추가해주기 (완료)
  3. 생성한 JWT에 대해 인증/인가 하기
  4. JWT 재발급 해주기
댓글
댓글쓰기 폼
공지사항
Total
248,427
Today
802
Yesterday
1,065
링크
«   2022/10   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함