๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

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.
๋ฐ˜์‘ํ˜•