S3๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๋ฒํท ๋ด ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ํ ํ ์ ์์ต๋๋ค. ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ์ ํ์ฑํ ํ๊ฒ ๋๋ฉด ์์์ ์์ ํ๊ฒ ๋ณดํธํ ์ ์์ง๋ง, ์ธ๋ถ์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํด s3 ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ S3๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ์ ํ๋ฉด์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ฃผ๋๋ฐ, ๊ทธ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ณ ์ ํฉ๋๋ค. Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)/๋ค์ด๋ก๋(GET) ํ๊ธฐ Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)๋ฅผ ์งํํ๊ณ , ๋ค์ด๋ก๋๋ ์๋ฒ๋ฅผ ํ๋ก์๋ก ๋์ด ์๋ฒ์์ S3์ ์ ๊ทผํ์ฌ ๋ค์ด๋ก๋(GET)ํ๊ธฐ Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)๋ฅผ ์งํํ๊ณ , ๋ค์ด๋ก๋๋ goofys๋ฅผ ์ฌ์ฉํ์ฌ S3..
์ด ๊ธ์ ๋ด์ฉ์ [์ดํํฐ๋ธ ์ฝํ๋ฆฐ]์ ์ฐธ๊ณ ํฉ๋๋ค. ๋๋ก๋ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์ ๋ฌํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์๋ ์ฝ๋์ฒ๋ผ ๋ง์ด์ฃ . data class Player( val id: Int, val name: String, val points: Int ) val player = Player(0, "Gecko", 9999) data ํ์ ์๋ ์๋์ ํจ์๋ค์ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค. toString equals ์ hashCode copy componentN(component1, component2 ๋ฑ) toString ํด๋์ค์ ์ด๋ฆ๊ณผ ๊ธฐ๋ณธ ์์ฑ์ ํํ๋ก ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ ์ถ๋ ฅ ํด์ค๋๋ค. ์ฃผ๋ก ๋ก๊ทธ ์ถ๋ ฅ์ด๋ ๋๋ฒ๊น ํ ๋ ์ฌ์ฉํฉ๋๋ค. println(player) // Player(id=0, name=Gecko, p..
์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. JWT ์์ฑํ๊ธฐ JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ (์งํ) ๊ตฌํ AuthController @RestController @RequestMapping("/auth") class AuthController( private val authService: AuthService ) { /** * token ์์ฑํด์ ๋ณด๋ด์ฃผ๊ธฐ */ @GetMapping("/login") fun login(@AuthenticationPrincipal oAuth2User: OAuth2User): ResponseEntity { return ResponseEntity.ok(authService.login(oAu..
์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. JWT ์์ฑํ๊ธฐ JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ (์งํ) JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ ๊ตฌํ JwtFilter class JwtFilter( private val jwtProvider: JwtProvider ) : OncePerRequestFilter() { override fun doFilterInternal( request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain ) { val jwt = jwtProvider.resolveToken(request) if (StringUtils.hasText(jwt) && ..
์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. 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..
์ด๋ฒ ๊ธ์์๋ Spring Security + Google Oauth2 + JWT๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. ์งํํ๊ธฐ ์์ Google Oauth2 Client_ID, Client_Secret๋ ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์ผ์๊ธธ ๋ฐ๋๋๋ค :) ์๋์ ๊ฐ์ ์์๋ก ์งํ๋ฉ๋๋ค. JWT ์์ฑํ๊ธฐ (์งํ) JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ ์ด๋ฒ ๊ธ์์๋ JWT ์์ฑํ๋ ๋ถ๋ถ์ ๋ํด ์งํํฉ๋๋ค. ๊ตฌํ build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.6.8" id("..