refactor : JwtSecurityProperties 상수용 object 추가

This commit is contained in:
banjjoknim
2022-04-04 00:15:12 +09:00
parent 409b3e4ae1
commit 9053fd087d
3 changed files with 14 additions and 6 deletions

View File

@@ -2,6 +2,7 @@ package com.banjjoknim.playground.jwt.config.filter
import com.auth0.jwt.JWT
import com.auth0.jwt.algorithms.Algorithm
import com.banjjoknim.playground.jwt.config.security.JwtSecurityProperties
import com.banjjoknim.playground.jwt.config.security.PrincipalDetails
import com.banjjoknim.playground.jwt.domain.user.JwtUser
import com.fasterxml.jackson.databind.ObjectMapper
@@ -136,15 +137,14 @@ class JwtAuthenticationFilter(
) {
val principalDetails = authResult.principal as PrincipalDetails
println("successfulAuthentication 실행됨 : ${principalDetails.user.username}의 인증이 완료되었다는 뜻.")
val jwtExpireSecond = 1000 * 60 * 10
// RSA 방식은 아니다. Hash 암호 방식.
val jwtToken = JWT.create()
.withSubject("banjjoknim 토큰")
.withExpiresAt(Date(System.currentTimeMillis() + jwtExpireSecond))
.withExpiresAt(Date(System.currentTimeMillis() + JwtSecurityProperties.EXPIRATION_TIME_SECONDS))
.withClaim("id", principalDetails.user.id)
.withClaim("username", principalDetails.user.username)
.sign(Algorithm.HMAC512("banjjoknim")) // 서버에서만 알고 있는 비밀 키를 사용한다.
.sign(Algorithm.HMAC512(JwtSecurityProperties.SECRET)) // 서버에서만 알고 있는 비밀 키를 사용한다.
response.addHeader(HttpHeaders.AUTHORIZATION, "Bearer $jwtToken")

View File

@@ -2,6 +2,7 @@ package com.banjjoknim.playground.jwt.config.filter
import com.auth0.jwt.JWT
import com.auth0.jwt.algorithms.Algorithm
import com.banjjoknim.playground.jwt.config.security.JwtSecurityProperties
import com.banjjoknim.playground.jwt.config.security.PrincipalDetails
import com.banjjoknim.playground.jwt.domain.user.JwtUserRepository
import org.springframework.http.HttpHeaders
@@ -47,8 +48,8 @@ class JwtAuthorizationFilter(
}
// JWT 토큰을 검증해서 정상적인 사용자인지 검사한다.
val jwtToken = jwtHeader.replace("Bearer ", "")
val jwtVerifier = JWT.require(Algorithm.HMAC512("banjjoknim")).build()
val jwtToken = jwtHeader.replace(JwtSecurityProperties.BEARER_TOKEN_PREFIX, "")
val jwtVerifier = JWT.require(Algorithm.HMAC512(JwtSecurityProperties.SECRET)).build()
val username = jwtVerifier.verify(jwtToken).getClaim("username").asString()
// username 이 null 이 아니라면 서명이 정상적으로 된 것이다.
@@ -58,7 +59,7 @@ class JwtAuthorizationFilter(
?: throw IllegalArgumentException("can not found jwtUser. username: $username")
val principalDetails = PrincipalDetails(jwtUser)
// Authentication 객체를 강제로 만든다. password 의 경우는 null 을 사용해도 무방하다. 우리가 임의로 Authentication 객체를 만들기 때문이다.
// Authentication 객체를 강제로 만든다. password 의 경우는 null 을 사용해도 무방하다. 우리가 직접 Authentication 객체를 만들기 때문이다.
// 이게 가능한 이유는, username 이 null 이 아니기 때문인데, username 이 null 이 아니라는 것은 인증이 정상적으로 진행되었다는 뜻이기 때문.
// 단, 이렇게 Authentication 객체를 만들 때는 권한을 직접 알려주어야(지정해주어야) 한다.
// 즉, JWT 토큰 서명을 통해서 서명이 정상이면 Authentication 객체를 만들어준다.

View File

@@ -0,0 +1,7 @@
package com.banjjoknim.playground.jwt.config.security
object JwtSecurityProperties {
const val SECRET = "banjjoknim"
const val EXPIRATION_TIME_SECONDS = 60 * 1000 * 10 // 10분 (1/1000 초를 기준으로 한다)
const val BEARER_TOKEN_PREFIX = "Bearer "
}