๋ฐ์ํ Spring Security18 [OAuth2] OAuth2 ๋ก๊ทธ์ธ ํ SuccessHandler ๊ตฌํ @RequiredArgsConstructor@Componentpublic class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler { public static final String REFRESH_TOKEN_COOKIE_NAME = "refresh_token"; public static final Duration REFRESH_TOKEN_DURATION = Duration.ofDays(14); public static final Duration ACCESS_TOKEN_DURATION = Duration.ofDays(1); public static final String REDIRECT_PATH = "/artic.. 2025. 5. 17. [OAuth2] ๋ด๊ฐ ๋ณด๋ ค๊ณ ๋ง๋ OAuth2 ํ๋ฆ ์ ๋ฆฌ ์๊ฐ ์์๋๋ก [1] ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ -> ์๋ฒ ์์ฒญ GET /oauth2/authorization/kakao Spring Security๊ฐ ํํฐ ์ฒด์ธ์์ ์ฒ๋ฆฌ,OAuth2AuthorizationrequestRedirectorFilter๊ฐ ๋์ [2] ์๋ฒ : OAuth2AuthorizationRequest ๊ฐ์ฒด ์์ฑOAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest .authorizationCode() .clientId("KAKAO_CLIENT_ID") .authorizationUri("https://kauth.kakao.com/oauth/authorize") .redirectUr.. 2025. 5. 16. [Spring Security] ์ฟ ํค vs ํค๋๋ก JWT ๋ณด๋ด๊ธฐ ์์ง๋ ๋ก๊ทธ์ธ์์ ๋ฒ์ด๋์ง ๋ชปํ ๋๊ทธ์น๋ง ๋๋ฌด ์ด๋ ค์.......์ด๊ฑฐ ์ด๋ ค์ํ๋๊ฑฐ ๋๋ง ๊ทธ๋ฐ๊ฑฐ ์๋๊ฒ ์ฐ?.. ์ํผ OAuth2 ์นด์นด์ค๋ก ๋ก๊ทธ์ธํ๋ ๋ถ๋ถ ํ๋ฆ์ ๊ณต๋ถํ๋ ์ค์,์ธ๊ฐ ์ฝ๋ ๋ฐ๊ณ -> ์์ธ์ค ํ ํฐ ๋ฐ๊ณ -> ์ฌ์ฉ์ ์ ๋ณด ์์ฒญํ๊ณ -> ๊ทธ ์ฌ์ฉ์ ์ ๋ณด๋ก JWT ํ ํฐ ๋ง๋ค๊ณ -> ๊ทธ ํ ํฐ์ ์ฟ ํค์ ๋ด์์ ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ธ๋ค-> ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ฟ ํค๋ฅผ ๋งค ์์ฒญ์ ํฌํจํด์ ๋ณด๋ธ๋ค ๊น์ง๋ ์๊ฒ ๋๋ฐ,๊ทธ๋ผ ์ ๊ตณ์ด ์ฟ ํค๋ฅผ ์ธ๊น? ํ๋ ์๋ฌธ์ด ๋ค์์ ์ฟ ํค๋ผ๋๊ฒ,์ฌ์ฉ์๊ฐ ๋๊ตฐ์ง ๊ธฐ์ตํด์ค์ ๋ก๊ทธ์ธ์ ์ ์ง์ํค๊ณ ..์ด๋ฐ ์ฅ์ ์ด ์๋ค๊ณ ๋ค์๋๋ฐ,์ง๊ธ๊น์ง์ ํ๋ฆ์ ๋ณด๋ฉด ์ด ์ฟ ํค์ ์ฅ์ ์ด ํ์ฉ๋๋๊ฒ ์ด๋์๋ ์์ด๋ณด์. ๊ทธ๋์ ์์๋ดค๋๋ฐ,์์ฝํ์๋ฉด ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์์ ๋ณด์๊ณผ, ๊ฐ๋ฐ์ ํธ์์ฑ ๋๋ฌธ์ด๋ผ๊ณ ํจ. Authorizat.. 2025. 5. 15. [Spring Security] Refresh Token ๊ธฐ๋ฐ์ผ๋ก new AccessToken๋ฐ๋ API ๊ตฌํํ๊ธฐ ๋ด๊ฐ ์์ ํฌ์คํ ์์ ์ป๋ ํ ํฐ ์ธ์ฆ ๊ณผ์ ์. [๋ฆฌํ๋ ์ ํ ํฐ ๋ฐ๊ธ ๊ณผ์ ]โ1. ํด๋ผ์ด์ธํธ -> ์๋ฒ : ์ธ์ฆ ์์ฒญ2. ์๋ฒ -> ํด๋ผ์ด์ธํธ : ์ก์ธ์ค ํ ํฐ & ๋ฆฌํ๋ ์ ํ ํฐ ์๋ต3. ์๋ฒ -> DB : ๋ฆฌํ๋ ์ ํ ํฐ์ ์ ์ฅ4. ํด๋ผ์ด์ธํธ -> ์๋ฒ :API ์์ฒญ5. ์๋ฒ : ํ ํฐ ์ ํจ์ฑ ๊ฒ์ฌ ํ๊ณ ์๋ต~~ ์๊ฐ์ด ํ๋ฅด๊ณ ~~6. ํด๋ผ์ด์ธํธ -> ์๋ฒ : (๋ง๋ฃ๋ ํ ํฐ์ผ๋ก) API ์์ฒญ7. ์๋ฒ -> ํด๋ผ์ด์ธํธ : ํ ํฐ ๋ง๋ฃ๋๋ค๊ณ ์๋ต8. ํด๋ผ์ด์ธํธ -> ์๋ฒ : (๋ฆฌํ๋ ์ ํ ํฐ๊ณผ ํจ๊ผ) ์ก์ธ์ค ํ ํฐ ๋ฐ๊ธ ์์ฒญ9. ์๋ฒ -> DB : ๋ฆฌํ๋ ์ ํ ํฐ ์กฐํ & ์ ํจ์ฑ ๊ฒ์ฌ10. ์๋ฒ -> ํด๋ผ : ๋ง์กฑํ๋ฉด, new ์ก์ธ์ค ํ ํฐ์ผ๋ก ์๋ต11. ํด๋ผ -> ์๋ฒ : new ์ก์ธ์ค ํ ํฐ์ผ๋ก ๋ค์ ์์ฒญ...(4๋ฒ๋ถํฐ.. 2025. 5. 5. [Spring Security] Token Filter ๊ตฌํํ๊ธฐ config ๋๋ ํ ๋ฆฌ์TokenAuthenticationFilter.java ํ์ผ ๋ง๋ค๊ฑฐ์. ์ด ํํฐ์์๋, ํ ํฐ์ ๋ด๊ธด Authorization ํค๋ ๊ฐ์ ธ์์,์์ธ์ค ํ ํฐ ์ ํจํ๋ฉด ์ธ์ฆ ์ ๋ณด ์ค์ ํ๋๊ฑธ ํ ๊ฑฐ์. @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // ์์ฒญ ํค๋์ Authorization ํค์ ๊ฐ ์กฐํ String authorizationHeader = re.. 2025. 5. 5. [Spring Security] SecurityContextHolder๋? ๋ฆฌํ๋ ์ฌ ํ ํฐ์ DB์๋ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์Entity๋ Repository๊น์ง ๋ง๋ค์ด์ค ์ํ ์ด์ ํ ํฐ ํํฐ๋ฅผ ๋ง๋ค ์ฐจ๋ก์. ํํฐ๋ ์ ๋ฌ๋๊ธฐ ์ ํ์URLํจ๋ก์ ๋ง๋ ๋ชจ๋ ์์ฒญ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด ์์.HTTP์์ฒญ์ด controller๊น์ง ๋๋ฌํ๊ธฐ ์ /ํ์ ์๋. ์์ฒญ์ด ์ค๋ฉด, ํค๋๊ฐ ๋น๊ตํด์ ํ ํฐ ์๋์ง ํ์ธํจ.์ ํจ์ฑ ํ์ธํ๊ณ ์ ํจํ ํ ํฐ์ด๋ฉด Security Context Holder(ํด๋์ค)์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํจ. ** SecurityContextHolder๋ ์์์๋ ์ ๊น ์ธ๊ธํ ์ ์๋๋ฐ,์ธ์ฆ ๊ฐ์ฒด(Authentication)๊ฐ ์ ์ฅ๋๋ ๊ณณ์.(๊ทธ๋์ getAuthentication()๋ฉ์๋๊ฐ ์ฃผ๋ก ํธ์ถ๋๋๊ณณ์ด ํํฐ๋ผ๊ณ ๋ค์)๋ฐ๋ผ์ ์ฌ๊ธฐ์ ์ธ์ฆ ๊ฐ์ฒด ๊บผ๋ด์ ์ฌ์ฉํ ์ ์์. ์ด ํด๋์ค๋ ์ค๋ ๋๋ง๋ค ๊ณต๊ฐ์.. 2025. 5. 5. [Spring Boot] ํ ์คํธ์ฝ๋์์ ๋กฌ๋ณต import์๋จ @Getterpublic class JwtFactory { private String subject = "test1@email.com"; private Date issuedAt = new Date(); private Date expiration = new Date(new Date().getTime() + Duration.ofDays(14).toMillis()); private Map claims = emptyMap(); // ๋น๋ ํจํด ์จ์ ์ค์ ์ด ํ์ํ ๋ฐ์ดํฐ๋ง ์ ํ ์ค์ @Builder public JwtFactory(String subject, Date issuedAt, Date expiration, Map claims) { this.subject .. 2025. 5. 4. [Spring Security] JWT์ Authentication๊ฐ์ฒด (์ฐ์์ ์ฐจ์ด, ๋ด๊ฐ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ ์ ๋ฆฌ) ๋๋ ์ง๊ธJWT ํ ํฐ ์์ฑ + ์ ํจ์ฑ ๊ฒ์ฌํ๋ ํด๋์ค ๊ณต๋ถํ๋ค๊ฐ์๊ธด ๊ถ๊ธ์ฆ๋ค์ด ์์ด์์ ๋ฆฌ ํ๋ ค๊ณ ํจโ๊ฑ ๋ด๊ฐ ์ดํดํ๋ฉด์ ์ฃผ์ ์ฃผ์ ์ฐ๋๊ฑฐ๋ผ์ฝ๊ธฐ ์์ข์ ์ ์์..ใ โ /*ํ ํฐ ์์ฑ & ์ฌ๋ฐ๋ฅธ ํ ํฐ์ธ์ง ์ ํจ์ฑ ๊ฒ์ฌํ ํฐ์์ ํ์ํ ์ ๋ณด ๊ฐ์ ธ์ค๋ ํด๋์ค */@RequiredArgsConstructor@Servicepublic class TokenProvider { private final JwtProperties jwtProperties; public String generateToken(User user, Duration expiredAt) { Date now = new Date(); return makeToken(new Date(now.getTime() + expiredA.. 2025. 5. 4. [Spring Security] ํ ํฐ ์์ฑ, ์ ํจ์ฑ ๊ฒ์ฌ, ์ ๋ณด ๋นผ์ค๋ ํด๋์ค ์ฝ๋ - TokenProvider ์ ํฌ์คํ ์์ ์์กด์ฑ ์ถ๊ฐ,์ด์ ๋ฐ๊ธ์ & ๋น๋ฐํค ์ค์ ํ๋ค์๊ทธ๊ฑธ ๋ณ์๋ก ๊ฐ๊ณ ์ค๋ ํด๋์ค (JwtProperties.java) ๋ง๋ค์์โ์ด๋ฒ์๋ ํ ํฐ ์์ฑํ๊ณ , ์ ํจ์ฑ ๊ฒ์ฆํ๊ณ ,ํ ํฐ์์ ํ์ํ ์ ๋ณด ๋นผ์ค๋ ํด๋์ค ์์ฑํ ๊ฑฐ์โ์ด๋ฆ์ TokenProvider.java์์น๋ config/jwt ๋๋ ํ ๋ฆฌ ๋ด /*ํ ํฐ ์์ฑ & ์ฌ๋ฐ๋ฅธ ํ ํฐ์ธ์ง ์ ํจ์ฑ ๊ฒ์ฌํ ํฐ์์ ํ์ํ ์ ๋ณด ๊ฐ์ ธ์ค๋ ํด๋์ค */@RequiredArgsConstructor@Servicepublic class TokenProvider { private final JwtProperties jwtProperties; public String generateToken(User user, Duration expiredAt) { Da.. 2025. 5. 4. ์ด์ 1 2 ๋ค์ ๋ฐ์ํ