반응형
이어서 계속 구현해보겠습니다.
구현 자체가 목적이므로 자세한 설명을 생략합니다.
- JWT 생성하기
- JWT에 권한 추가해주기 (진행)
- 생성한 JWT에 대해 인증/인가 하기
- 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가 추가된 것을 볼 수 있습니다.
- JWT 생성하기
- JWT에 권한 추가해주기 (완료)
- 생성한 JWT에 대해 인증/인가 하기
- JWT 재발급 해주기
반응형
'...' 카테고리의 다른 글
[Spring] Security +Google Oauth2 + JWT 구현하기 (4) - JWT 재발급 해주기 (0) | 2022.06.05 |
---|---|
[Spring] Security +Google Oauth2 + JWT 구현하기 (3) - 생성한 JWT에 대해 인증/인가 하기 (0) | 2022.06.05 |
[Spring] Security +Google Oauth2 + JWT 구현하기 (1) - JWT 생성하기 (0) | 2022.06.04 |
[Kotlin] 제네릭 타입과 variance 한정자를 활용하라 (2) | 2022.04.29 |
[Java] 스프링을 왜 사용할까?(2) - OCP와 DIP 해결 By 순수 자바 (3) | 2022.02.01 |