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

springsecurity17

[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.
[OAuth2] OAuth2 ์‚ฌ์šฉ์ž ์„œ๋น„์Šค ๊ตฌํ˜„ํ•˜๊ธฐ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•ด์„œ, ์œ ์ € ํ…Œ์ด๋ธ”์— ์ •๋ณด๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋ผ๋ฉด๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ด๋ฆ„์„ ์—…๋Žƒํ•ด์คŒ. ์œ ์ € ํ…Œ์ด๋ธ”์— ์ •๋ณด๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž๋ผ๋ฉด์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ด์„œ DB์— ์ €์žฅ @Table(name = "users")@NoArgsConstructor(access = AccessLevel.PROTECTED)@Getter@Entitypublic class User implements UserDetails { // ์ƒ๋žต // ๋‹‰๋„ค์ž„ ํ•„๋“œ ์ถ”๊ฐ€ @Column(name = "nickname", unique = true) private String nickname; // ๋นŒ๋“œ ํŒจํ„ด์— ๋‹‰๋„ค์ž„ ์ถ”๊ฐ€ @Builder public User(String email, String .. 2025. 5. 11.
[Java] ์ž๋ฐ” ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”๊ฐ€ ๋ญ˜๊นŒ?ObjectMapper ํด๋ž˜์Šค ObjectMapper ํด๋ž˜์Šค๊ฐ€ ๋“ค์–ด๊ฐ„ ์‹ค์Šต ์ฝ”๋“œ๊ฐ€ ์žˆ๊ธธ๋ž˜ ๊ถ๊ธˆํ•ด์„œ ์•Œ์•„๋ด„โ€‹โ€‹โ€‹ObjectMapper ํด๋ž˜์Šค ํ†ตํ•ด์„œ ๋งŒ๋“  ๊ฐ์ฒด๋Š”,โ€‹์ž๋ฐ” ๊ฐ์ฒด -> Json๊ฐ์ฒด (์ง๋ ฌํ™”)Json๊ฐ์ฒด -> ์ž๋ฐ” ๊ฐ์ฒด (์—ญ์ง๋ ฌํ™”)ํ• ๋•Œ ์“ฐ์ž„ HTTP์—์„œ๋Š” JSON์„ ์“ฐ๊ณ JAVA์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•จโ€‹๊ทธ๋ ‡๋‹ค๋ฉด ์„œ๋กœ ํ˜•์‹์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์ˆ˜์ ์ž„.โ€‹๊ทธ๋Ÿฐ ์ž‘์—…์„ ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™” ๋ผ๊ณ  ํ•˜๋Š”๊ฑฐ์ž„(์ด๋ฆ„์ด ๊ดœํžˆ ์–ด๋ ค์›Œ..)โ€‹โ€‹์˜ˆ๋ฅผ๋“ค์–ดโ€‹์ž๋ฐ” ๊ฐ์ฒด๊ฐ€ ํ•˜๋‚˜ ์žˆ๋Š”๋ฐ, ์ด ๊ฐ์ฒด ์•ˆ์—๋Š”"title"์—๋Š” "์ œ๋ชฉ1"์ด๋ผ๋Š” ๊ฐ’์ด,"content"์—๋Š” "๋‚ด์šฉ1"์ด๋ผ๋Š” ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์น˜์ž.โ€‹---> (JSON์œผ๋กœ ์ง๋ ฌํ™”) --->{"title" : "์ œ๋ชฉ1","content": "๋‚ด์šฉ1"} ์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜๋˜๋Š”๊ฑฐ์ž„!!!!โ€‹โ€‹์—ญ์ง๋ ฌํ™”๋Š” ๊ฑ ๋ฐ˜๋Œ€โ€‹ O.. 2025. 5. 4.
[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.
[Spring Security] JWT ๊ตฌํ˜„ ์ค€๋น„๋‹จ๊ณ„(์˜์กด์„ฑ ์ถ”๊ฐ€, ์ด์Šˆ ๋ฐœ๊ธ‰์ž, ๋น„๋ฐ€ํ‚ค ์„ค์ •) 1. ์˜์กด์„ฑ ์ถ”๊ฐ€ build.gradle์—์„œdependencies์— implementation 'io.jsonwebtoken:jjwt:0.9.1'implementation 'javax.xml.bind:jaxb-api:2.3.1' ์ถ”๊ฐ€ 2. ํ† ํฐ ์ œ๊ณต์ž ์ถ”๊ฐ€ applicaion.properties์— //.yml ํ˜•์‹์€jwt: issuer: tester1@gmail.com secret_key_ : study-springboot//.properties ํ˜•์‹์€jwt.issuer=tester1@gmail.comjwt.secret_key_=study-springboot์ด์ œ ์œ„์— ๊ฐ’๋“ค์„ ๋ณ€์ˆ˜๋กœ ์ ‘๊ทผํ•˜๋Š”๋ฐ ์“ฐ๋Š” JwtProperties ํด๋ž˜์Šค ๋งŒ๋“ค ์ฐจ๋ก€โ€‹์ฐธ๊ณ ๋กœ Spring Boot๋Š” ํ•˜์ดํ”ˆ(-) → ์นด๋ฉœ์ผ€.. 2025. 5. 4.
๋ฐ˜์‘ํ˜•