diff --git a/build.gradle.kts b/build.gradle.kts index 019fe8e..8268c85 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -44,6 +44,8 @@ dependencies { testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc") testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1") + testImplementation("org.springframework.security:spring-security-test") // Jasypt implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5") @@ -93,6 +95,10 @@ sourceSets { } } +tasks.test { + useJUnitPlatform() +} + tasks.named("clean") { doLast { file(querydslDir).deleteRecursively() diff --git a/src/main/kotlin/com/study/core/auth/application/AuthService.kt b/src/main/kotlin/com/study/core/auth/application/AuthService.kt index 2be28e1..f231128 100644 --- a/src/main/kotlin/com/study/core/auth/application/AuthService.kt +++ b/src/main/kotlin/com/study/core/auth/application/AuthService.kt @@ -1,6 +1,8 @@ package com.study.core.auth.application -import com.study.core.auth.dto.response.TokenResponse +import com.study.core.auth.infrastructure.dto.response.AccessTokenResponse +import com.study.core.auth.infrastructure.dto.response.TokenResponse +import com.study.core.auth.infrastructure.support.RefreshTokenCookieSupporter import com.study.core.global.enums.AuthProvider import com.study.core.global.exceptions.CustomException import com.study.core.global.exceptions.auth.AuthExceptionType @@ -9,6 +11,7 @@ import com.study.core.user.domain.User import com.study.core.user.domain.UserOAuth import com.study.core.user.infrastructure.UserOAuthRepository import com.study.core.user.infrastructure.UserRepository +import jakarta.servlet.http.HttpServletResponse import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -16,7 +19,8 @@ import org.springframework.transaction.annotation.Transactional class AuthService( private val userRepository: UserRepository, private val userOAuthRepository: UserOAuthRepository, - private val jwtProvider: JwtProvider + private val jwtProvider: JwtProvider, + private val refreshTokenCookieSupporter: RefreshTokenCookieSupporter ) { @Transactional @@ -28,7 +32,7 @@ class AuthService( ?: run { // 이메일 기준 기존 회원 조회 val user: User = userRepository.findByEmail(email) - // 메일이 없는 경우 신규 사용자 저장 + // 메일이 없는 경우 신규 사용자 저장 ?: userRepository.save(User.of(email = email)) // 소셜 계정 매핑 저장 @@ -52,8 +56,8 @@ class AuthService( // 액세스 토큰 재발급 @Transactional(readOnly = true) - fun reissue(refreshToken: String?): TokenResponse { - if (refreshToken.isNullOrBlank()) { + fun reissue(refreshToken: String, response: HttpServletResponse): AccessTokenResponse { + if (refreshToken.isBlank()) { throw CustomException(AuthExceptionType.UNAUTHENTICATED) } @@ -62,10 +66,24 @@ class AuthService( } val userId = jwtProvider.getSubjectAsUserId(refreshToken) - val user = userRepository.findById(userId) .orElseThrow { CustomException(AuthExceptionType.USER_NOT_FOUND) } - return jwtProvider.generateToken(user.id, user.role) + // accessToken, refreshToken 재발급 + val tokenResponse = jwtProvider.generateToken(user.id, user.role) + + // 새 refreshToken로 갱신 + refreshTokenCookieSupporter.addRefreshTokenCookie(response, tokenResponse.refreshToken) + + return AccessTokenResponse( + grantType = tokenResponse.grantType, + accessToken = tokenResponse.accessToken, + accessTokenExpiresIn = tokenResponse.accessTokenExpiresIn + ) + } + + @Transactional(readOnly = true) + fun logout(response: HttpServletResponse) { + refreshTokenCookieSupporter.expireRefreshTokenCookie(response) } } diff --git a/src/main/kotlin/com/study/core/auth/dto/response/TokenResponse.kt b/src/main/kotlin/com/study/core/auth/infrastructure/dto/response/AccessTokenResponse.kt similarity index 50% rename from src/main/kotlin/com/study/core/auth/dto/response/TokenResponse.kt rename to src/main/kotlin/com/study/core/auth/infrastructure/dto/response/AccessTokenResponse.kt index abf9a1c..02309da 100644 --- a/src/main/kotlin/com/study/core/auth/dto/response/TokenResponse.kt +++ b/src/main/kotlin/com/study/core/auth/infrastructure/dto/response/AccessTokenResponse.kt @@ -1,9 +1,8 @@ -package com.study.core.auth.dto.response +package com.study.core.auth.infrastructure.dto.response -data class TokenResponse( +data class AccessTokenResponse( val grantType: String, val accessToken: String, - val refreshToken: String, val accessTokenExpiresIn: Long ) { } diff --git a/src/main/kotlin/com/study/core/auth/infrastructure/dto/response/TokenResponse.kt b/src/main/kotlin/com/study/core/auth/infrastructure/dto/response/TokenResponse.kt new file mode 100644 index 0000000..3595655 --- /dev/null +++ b/src/main/kotlin/com/study/core/auth/infrastructure/dto/response/TokenResponse.kt @@ -0,0 +1,10 @@ +package com.study.core.auth.infrastructure.dto.response + +data class TokenResponse( + val grantType: String, + val accessToken: String, + val accessTokenExpiresIn: Long, + val refreshToken: String, + val refreshTokenExpiresIn: Long +) { +} diff --git a/src/main/kotlin/com/study/core/auth/infrastructure/support/RefreshTokenCookieSupporter.kt b/src/main/kotlin/com/study/core/auth/infrastructure/support/RefreshTokenCookieSupporter.kt new file mode 100644 index 0000000..5c25971 --- /dev/null +++ b/src/main/kotlin/com/study/core/auth/infrastructure/support/RefreshTokenCookieSupporter.kt @@ -0,0 +1,37 @@ +package com.study.core.auth.infrastructure.support + +import com.study.core.auth.infrastructure.dto.response.TokenResponse +import jakarta.servlet.http.HttpServletResponse +import org.springframework.http.HttpHeaders +import org.springframework.http.ResponseCookie +import org.springframework.stereotype.Component + +@Component +class RefreshTokenCookieSupporter { + + fun addRefreshTokenCookie( + response: HttpServletResponse, + refreshToken: String + ) { + // refreshToken은 HttpOnly + Secure cookie로 전송 + val refreshCookie = ResponseCookie.from("refreshToken", refreshToken) + .httpOnly(true) + .secure(true) + .path("/") + .sameSite("Strict") + .maxAge(60L * 60 * 24 * 14) // 14일 + .build() + response.addHeader(HttpHeaders.SET_COOKIE, refreshCookie.toString()) + } + + fun expireRefreshTokenCookie(response: HttpServletResponse) { + val expiredCookie = ResponseCookie.from("refreshToken", "") + .httpOnly(true) + .secure(true) + .path("/") + .sameSite("Strict") + .maxAge(0) + .build() + response.addHeader(HttpHeaders.SET_COOKIE, expiredCookie.toString()) + } +} diff --git a/src/main/kotlin/com/study/core/auth/oauth/OAuth2SuccessHandler.kt b/src/main/kotlin/com/study/core/auth/oauth/OAuth2SuccessHandler.kt index 1140592..2c23f97 100644 --- a/src/main/kotlin/com/study/core/auth/oauth/OAuth2SuccessHandler.kt +++ b/src/main/kotlin/com/study/core/auth/oauth/OAuth2SuccessHandler.kt @@ -1,23 +1,22 @@ package com.study.core.auth.oauth -import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.study.core.auth.application.AuthService -import com.study.core.auth.dto.response.TokenResponse +import com.study.core.auth.infrastructure.support.RefreshTokenCookieSupporter import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse -import org.springframework.http.HttpHeaders -import org.springframework.http.ResponseCookie +import org.springframework.beans.factory.annotation.Value import org.springframework.security.core.Authentication import org.springframework.security.web.authentication.AuthenticationSuccessHandler import org.springframework.stereotype.Component @Component class OAuth2SuccessHandler( - private val authService: AuthService + private val authService: AuthService, + private val refreshTokenCookieSupporter: RefreshTokenCookieSupporter, + @Value("\${app.oauth2.redirect-uri}") + private val frontRedirectUri: String ) : AuthenticationSuccessHandler { - private val objectMapper = jacksonObjectMapper() - override fun onAuthenticationSuccess( request: HttpServletRequest, response: HttpServletResponse, @@ -30,32 +29,10 @@ class OAuth2SuccessHandler( // (provider, providerId, email)로 로그인 / 없으면 신규 가입 val tokenResponse = authService.login(provider, userInfo.id, userInfo.email) - tokenToResponse(response, tokenResponse) - } + refreshTokenCookieSupporter.addRefreshTokenCookie(response, tokenResponse.refreshToken) - private fun tokenToResponse( - response: HttpServletResponse, - tokenResponse: TokenResponse - ) { - // refreshToken은 HttpOnly + Secure cookie로 전송 - val refreshCookie = ResponseCookie.from("refreshToken", tokenResponse.refreshToken) - .httpOnly(true) - .secure(true) - .path("/") - .sameSite("Strict") - .maxAge(60L * 60 * 24 * 14) // 14일 - .build() - response.addHeader(HttpHeaders.SET_COOKIE, refreshCookie.toString()) - - // accessToken은 body로 전송 - val accessTokenBody = mapOf( - "grantType" to tokenResponse.grantType, - "accessToken" to tokenResponse.accessToken, - "accessTokenExpireIn" to tokenResponse.accessTokenExpiresIn - ) - - response.contentType = "application/json" - response.characterEncoding = "UTF-8" - response.writer.write(objectMapper.writeValueAsString(accessTokenBody)) + response.sendRedirect(frontRedirectUri) } + + } diff --git a/src/main/kotlin/com/study/core/auth/ui/AuthController.kt b/src/main/kotlin/com/study/core/auth/ui/AuthController.kt index 4a4a2b5..17b9908 100644 --- a/src/main/kotlin/com/study/core/auth/ui/AuthController.kt +++ b/src/main/kotlin/com/study/core/auth/ui/AuthController.kt @@ -1,7 +1,7 @@ package com.study.core.auth.ui -import com.study.core.auth.dto.response.TokenResponse import com.study.core.auth.application.AuthService +import com.study.core.auth.infrastructure.dto.response.AccessTokenResponse import jakarta.servlet.http.HttpServletResponse import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.CookieValue @@ -23,8 +23,15 @@ class AuthController( @PostMapping("/reissue") fun reissue( - @CookieValue(value = "refreshToken", required = false) refreshToken: String? - ): ResponseEntity { - return ResponseEntity.ok(authService.reissue(refreshToken)) + @CookieValue(value = "refreshToken", required = false) refreshToken: String, + response: HttpServletResponse + ): ResponseEntity { + return ResponseEntity.ok(authService.reissue(refreshToken, response)) + } + + @PostMapping("/logout") + fun logout(response: HttpServletResponse): ResponseEntity { + authService.logout(response) + return ResponseEntity.ok().build() } } diff --git a/src/main/kotlin/com/study/core/global/config/SecurityConfig.kt b/src/main/kotlin/com/study/core/global/config/SecurityConfig.kt index 3da551e..6273303 100644 --- a/src/main/kotlin/com/study/core/global/config/SecurityConfig.kt +++ b/src/main/kotlin/com/study/core/global/config/SecurityConfig.kt @@ -50,8 +50,9 @@ class SecurityConfig( it.requestMatchers( "/auth/login", // 로그인 시작점 "/auth/reissue", + "/auth/logout", "/oauth2/**", - "/login/oauth2/**" // 콜백 + "/auth/callback" // 콜백 ).permitAll() .anyRequest().authenticated() } diff --git a/src/main/kotlin/com/study/core/global/security/JwtProvider.kt b/src/main/kotlin/com/study/core/global/security/JwtProvider.kt index 6dfa017..ebbe0ef 100644 --- a/src/main/kotlin/com/study/core/global/security/JwtProvider.kt +++ b/src/main/kotlin/com/study/core/global/security/JwtProvider.kt @@ -1,11 +1,12 @@ package com.study.core.global.security -import com.study.core.auth.dto.response.TokenResponse +import com.study.core.auth.infrastructure.dto.response.TokenResponse import com.study.core.global.enums.UserRole import io.jsonwebtoken.* import io.jsonwebtoken.io.Decoders import io.jsonwebtoken.security.Keys import jakarta.servlet.http.HttpServletRequest +import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpHeaders import org.springframework.security.authentication.UsernamePasswordAuthenticationToken @@ -16,9 +17,15 @@ import java.security.Key import java.util.Date @Component -class JwtProvider ( - @Value("\${jwt.secret}") private val secretKey: String +class JwtProvider( + @Value("\${jwt.secret}") + private val secretKey: String, + @Value("\${jwt.log-token:false}") + private val logToken: Boolean ){ + + private val log = LoggerFactory.getLogger(JwtProvider::class.java) + // key 초기화 private val key : Key by lazy { Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretKey)) @@ -28,7 +35,7 @@ class JwtProvider ( fun generateToken(userId: Long, role: UserRole) : TokenResponse { val now = Date().time val accessTokenExpiresIn: Date = Date(now + ACCESS_TOKEN_EXPIRE_TIME) - + val refreshTokenExpiresIn: Date = Date(now + REFRESH_TOKEN_EXPIRE_TIME) // accessToken 생성 val accessToken = Jwts.builder() .setSubject(userId.toString()) // 토큰 주체 @@ -40,15 +47,22 @@ class JwtProvider ( // refreshToken 생성 val refreshToken = Jwts.builder() .setSubject(userId.toString()) - .setExpiration(Date(now + REFRESH_TOKEN_EXPIRE_TIME)) + .setExpiration(refreshTokenExpiresIn) .signWith(key, SignatureAlgorithm.HS512) .compact() + // 로컬에서만 로그 노출 + if (logToken) { + log.debug("accessToken: $accessToken") + log.debug("refreshToken: $refreshToken") + } + return TokenResponse( grantType = BEARER_TYPE, accessToken = accessToken, + accessTokenExpiresIn = accessTokenExpiresIn.time, refreshToken = refreshToken, - accessTokenExpiresIn = accessTokenExpiresIn.time + refreshTokenExpiresIn = refreshTokenExpiresIn.time ) } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c91a8fd..e5b87bb 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -24,9 +24,14 @@ spring: - email - profile +app: + oauth2: + redirect-uri: "http://localhost:3000/auth/callback" + jwt: secret: ENC(f2XSsyj/+tUsSlxV7tM8Rk5LEdp4mCX3BStVto1KOYYoAGpyeJg/+oJf6W76loaVM0ZSQ2l/MKpq9CVyZ4De5AzFGNM5HA1BviCg4ZEcH2Fyg0eNqvFC8KsUOA5mGm6P995uVtBMk6V6yNBOOujwFFk9CmmH/ykRtkI3s/t+SVST93tqUYc7IgbnV+7LfMln) + log-token: false jasypt: encryptor: - password: ${ENCRYPT_KEY} # 환경변수 주입 \ No newline at end of file + password: ${ENCRYPT_KEY} # 환경변수 주입 diff --git a/src/test/kotlin/com/study/core/DokiApplicationTests.kt b/src/test/kotlin/com/study/core/DokiApplicationTests.kt index 4b03f0e..686418f 100644 --- a/src/test/kotlin/com/study/core/DokiApplicationTests.kt +++ b/src/test/kotlin/com/study/core/DokiApplicationTests.kt @@ -2,8 +2,10 @@ package com.study.core import org.junit.jupiter.api.Test import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ActiveProfiles @SpringBootTest +@ActiveProfiles("test") class DokiApplicationTests { @Test diff --git a/src/test/kotlin/com/study/core/auth/AuthControllerReissueTest.kt b/src/test/kotlin/com/study/core/auth/AuthControllerReissueTest.kt new file mode 100644 index 0000000..fee2e5a --- /dev/null +++ b/src/test/kotlin/com/study/core/auth/AuthControllerReissueTest.kt @@ -0,0 +1,50 @@ +package com.study.core.auth + +import com.study.core.auth.application.AuthService +import com.study.core.auth.infrastructure.dto.response.AccessTokenResponse +import com.study.core.auth.ui.AuthController +import jakarta.servlet.http.Cookie +import org.junit.jupiter.api.Test +import org.mockito.kotlin.any +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.test.web.servlet.MockMvc +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post +import org.springframework.test.web.servlet.result.MockMvcResultMatchers.* +import org.mockito.kotlin.anyOrNull +import org.mockito.kotlin.whenever +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc + +@WebMvcTest(AuthController::class) +@AutoConfigureMockMvc(addFilters = false) +class AuthControllerReissueTest { + + @Autowired + lateinit var mockMvc: MockMvc + + @MockBean + lateinit var authService: AuthService + + @Test + fun `쿠키를_받아_response에_토큰을_정상적으로_반환된다`(){ + // given - AuthService가 refreshToken으로 새 TokenResponse 반환 + val accessToken = AccessTokenResponse( + grantType = "Bearer", + accessToken = "new-access", + accessTokenExpiresIn = 3600L + ) + whenever(authService.reissue(anyOrNull(), any())).thenReturn(accessToken) + + // when - refreshToken 쿠키를 포함해 /auth/reissue 호출 + mockMvc.perform( + post("/auth/reissue") + .cookie(Cookie("refreshToken", "valid-refresh")) + ) + // then - 상태 코드(200), AccessTokenResponse가 body에 반환되는지 검증 + .andExpect(status().isOk) + .andExpect(jsonPath("$.grantType").value("Bearer")) + .andExpect(jsonPath("$.accessToken").value("new-access")) + .andExpect(jsonPath("$.accessTokenExpiresIn").value(3600)) + } +} diff --git a/src/test/kotlin/com/study/core/auth/AuthServiceTest.kt b/src/test/kotlin/com/study/core/auth/AuthServiceTest.kt new file mode 100644 index 0000000..73fedfb --- /dev/null +++ b/src/test/kotlin/com/study/core/auth/AuthServiceTest.kt @@ -0,0 +1,88 @@ +package com.study.core.auth + + +import com.study.core.auth.application.AuthService +import com.study.core.auth.infrastructure.dto.response.AccessTokenResponse +import com.study.core.auth.infrastructure.dto.response.TokenResponse +import com.study.core.auth.infrastructure.support.RefreshTokenCookieSupporter +import com.study.core.global.security.JwtProvider +import com.study.core.user.domain.User +import com.study.core.user.infrastructure.UserOAuthRepository +import com.study.core.user.infrastructure.UserRepository +import jakarta.servlet.http.HttpServletResponse +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.mockito.ArgumentMatchers.anyLong +import org.mockito.Mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.verify +import org.mockito.kotlin.eq +import org.mockito.kotlin.times +import org.mockito.junit.jupiter.MockitoExtension +import org.springframework.mock.web.MockHttpServletResponse +import java.util.Optional + +@ExtendWith(MockitoExtension::class) +class AuthServiceTest { + + @Mock + lateinit var userRepository: UserRepository + + @Mock + lateinit var userOAuthRepository: UserOAuthRepository + + @Mock + lateinit var jwtProvider: JwtProvider + + @Mock + lateinit var refreshTokenCookieSupporter: RefreshTokenCookieSupporter + + lateinit var authService: AuthService + + @BeforeEach + fun setUp() { + authService = AuthService(userRepository, userOAuthRepository, jwtProvider, refreshTokenCookieSupporter) + } + + @Test + // 주어진 refreshToken에 대해 토큰 유효성 검증, 유저 조회, 새 토큰 발급 검증 + fun `reissue_호출시_새로운_토큰과_쿠키를_발급하고_검증한다`() { + // given - refreshToken, 해당 토큰으로 조회 가능한 사용자, 새 TokenReponse 발급용 mock 세팅 + val refreshToken = "valid-refresh-token" + val userId = 1L + + // jwtProvider가 refreshToken을 유효하다고 판단 + whenever(jwtProvider.validateToken(refreshToken)).thenReturn(true) + whenever(jwtProvider.getSubjectAsUserId(refreshToken)).thenReturn(userId) + + // userId로 User를 조회 + val user = User.of(email = "test@example.com").apply { id = userId } + whenever(userRepository.findById(anyLong())).thenReturn(Optional.of(user)) + + // jwtProvider가 새 토큰 발급 + val newTokenResponse = TokenResponse( + grantType = "Bearer", + accessToken = "new-access-token", + accessTokenExpiresIn = 3600L, + refreshToken = "new-refresh-token", + refreshTokenExpiresIn = 60L * 60 * 24 * 14 + ) + whenever(jwtProvider.generateToken(user.id, user.role)).thenReturn(newTokenResponse) + + val servletResponse: HttpServletResponse = MockHttpServletResponse() + + // when + val result: AccessTokenResponse = authService.reissue(refreshToken, servletResponse) + + // then - body로 전달되는 AccessTokenResponse 검증 + assertThat(result.grantType).isEqualTo("Bearer") + assertThat(result.accessToken).isEqualTo("new-access-token") + assertThat(result.accessTokenExpiresIn).isEqualTo(3600L) + + // then - refreshToken은 쿠키로만 전달되도록 supporter가 호출되었는지 검증 + verify(refreshTokenCookieSupporter, times(1)) + .addRefreshTokenCookie(eq(servletResponse), eq("new-refresh-token")) + } +} diff --git a/src/test/kotlin/com/study/core/auth/RefreshTokenCookieSupporterTest.kt b/src/test/kotlin/com/study/core/auth/RefreshTokenCookieSupporterTest.kt new file mode 100644 index 0000000..9c3114e --- /dev/null +++ b/src/test/kotlin/com/study/core/auth/RefreshTokenCookieSupporterTest.kt @@ -0,0 +1,32 @@ +package com.study.core.auth + +import com.study.core.auth.infrastructure.support.RefreshTokenCookieSupporter +import org.junit.jupiter.api.Test +import org.springframework.http.HttpHeaders +import org.springframework.mock.web.MockHttpServletResponse +import org.assertj.core.api.Assertions.assertThat + +class RefreshTokenCookieSupporterTest { + + private val supporter = RefreshTokenCookieSupporter() + + @Test + // RefreshCookieSupporter가 HttpOnly, Secure, Path, Max-Age가 포함된 Set-Cookie 헤더를 추가하는지 검증 + fun `설정한_옵션값대로_쿠키를_생성한다`() { + // given - 빈 ServletResponse, refreshToken이 든 TokenResponse 준비 + val response = MockHttpServletResponse() + val refreshToken = "test-refresh-token" + + // when - cookie 생성 메서드를 호출해 응답에 refreshToken 쿠키 추가 + supporter.addRefreshTokenCookie(response, refreshToken) + + // then - Set-Cookie 헤더가 존재하는지, 속성이 정상적으로 포함되어있는지 검증 + val setCookie = response.getHeader(HttpHeaders.SET_COOKIE) + assertThat(setCookie).isNotNull + assertThat(setCookie).contains("refreshToken=test-refresh-token") + assertThat(setCookie).contains("HttpOnly") + assertThat(setCookie).contains("Secure") + assertThat(setCookie).contains("Path=/") + assertThat(setCookie).contains("Max-Age") + } +} diff --git a/src/test/resources/application.yml b/src/test/resources/application-test.yml similarity index 89% rename from src/test/resources/application.yml rename to src/test/resources/application-test.yml index 87036b7..b705e38 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application-test.yml @@ -1,6 +1,4 @@ spring: - profiles: - active: test jpa: hibernate: ddl-auto: create @@ -21,7 +19,8 @@ spring: client-secret: test-secret jwt: - secret: jwt-secret + secret: test-jwt-secret + log-token: false jasypt: encryptor: