diff --git a/keyword/chapter10/keyword.md b/keyword/chapter10/keyword.md new file mode 100644 index 0000000..61aab3a --- /dev/null +++ b/keyword/chapter10/keyword.md @@ -0,0 +1,168 @@ +## ๐Ÿ” Spring Security๋ž€? + +> Spring ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization)๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ณด์•ˆ ํ”„๋ ˆ์ž„์›Œํฌ +> +- ํ•„๋”(Filter)๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ ์Šคํ”„๋ง MVC์™€ ๋ถ„๋ฆฌ๋˜์–ด ๊ด€๋ฆฌ ๋ฐ ๋™์ž‘ํ•œ๋‹ค. + +### ์ธ์ฆ (Authentication) + +- โ€œ๋ˆ„๊ฐ€ ๋“ค์–ด์™”์ง€?โ€ +- ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. + +### ์ธ๊ฐ€ (Authorization) + +- โ€œ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?โ€ +- ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํŒ๋‹จํ•œ๋‹ค. + +### ๋™์ž‘ ๊ตฌ์กฐ (์š”์ฒญ ํ๋ฆ„) + +- Client + - ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. +- Security Filter Chain + - ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์–ด ๋ณด์•ˆ ๊ด€๋ จ ํ•„ํ„ฐ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค. +- Authentication Filter + - ์—ฌ๋Ÿฌ Security Filter ์ค‘์—์„œ UsernamePasswordAuthenticationFilter์—์„œ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. + - HttpServletRequest์—์„œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ถ”์ถœํ•˜์—ฌ UsernameAuthenticationToken์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค. + - AuthenticationManager์—๊ฒŒ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. +- AuthenticationManager + - ์ „๋‹ฌ๋ฐ›์€ Authentication ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ด€๋ฆฌ, ํŒ๋‹จํ•œ๋‹ค. + - UsernameAuthenticationToken์ด ์˜ฌ๋ฐ”๋ฅธ ์œ ์ €์ธ์ง€ ํ™•์ธํ•œ๋‹ค. +- AuthenticationProvider + - ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ฒ€์ฆํ•˜์—ฌ ์ธ์ฆ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. +- UserDetailsService + - ์‚ฌ์šฉ์ž ์‹๋ณ„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ DB๋“ฑ์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค. + +### ์ฃผ์š” Component + +- Authentication + - ํ˜„์žฌ ์ ‘๊ทผํ•˜๋Š” ์ฃผ์ฒด์˜ ์ •๋ณด์™€ ๊ถŒํ•œ์„ ๋‹ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค + + ```java + getCredentials(); + getDetails(); + getPrincipal(); + isAuthenticated(); + setAuthenticated(boolean isAuthenticated); + ``` + +- SecurityContext + - Authentication์„ ๋ณด๊ด€ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. + - SecurityContext๋ฅผ ํ†ตํ•ด Authentication๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. +- SecurityContextHolder + - ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ํ˜„์žฌ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค. + - ๊ธฐ๋ณธ์ ์œผ๋กœ ThreadLocal ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•œ๋‹ค. + + ```cpp + ์ธ์ฆ์— ์„ฑ๊ณต + -> principal + credential ์„ Authentication์— ๋‹ด์Œ. + -> Spring Security์—์„œ Authentication์„ SpringContext์— ๋‹ด์•„ ๋ณด๊ด€ + -> ์ด SpringContext๋ฅผ SecurityContextHolder์— ๋‹ด์•„ ๋ณด๊ด€ํ•จ. + ``` + +- UserDetails + - Authentication ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•œ UsernamePasswordAuthenticationToken์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. + - UserDetails๋ฅผ implements ํ•˜์—ฌ ๊ตฌํ˜„์ฒด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. + + ```cpp + public class CustomUserDetails implements UserDetails { + private User user; + + public User getUser() { + return user; + } + + public CustomUserDetails(User account) { + this.user = account; + } + + @Override + . + . + . + } + ``` + +- UserDetailsService + - UserDetails ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. + + ```java + UserDetails loadUserByUsername(String username); + ``` + + - ์ธ์ฆ ๊ณผ์ •์—์„œ UserDetailService โ†’ UserDetails โ†’ Authentication ์ƒ์„ฑ ํ๋ฆ„ +- PasswordEncoder + - ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ + - ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ , ์•”ํ˜ธํ™”๋œ ๊ฐ’๋ผ๋ฆฌ ๋น„๊ตํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™” + + ```java + String encode(CharSequence rawPassword); + boolean matches(CharSequence rawPassword, String encodedPassword); + ``` + + - ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” DB์— ๋ฐ˜๋“œ์‹œ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ๋กœ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค! + + ## ์ธ์ฆ (Authentication) + +- โ€œ๋ˆ„๊ตฌ์ธ๊ฐ€???โ€ +- ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. +- ์ธ์ฆ์ด ๋˜์ง€ ์•Š์œผ๋ฉด, ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ํ˜„์žฌ ์š”์ฒญ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค. + +## ์ธ๊ฐ€ (Authorization) + +- โ€œ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋‚˜??โ€ +- ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. +- ์ธ์ฆ์ด ๋˜์–ด์žˆ์–ด๋„ ์ธ๊ฐ€๊ฐ€ ์—†์œผ๋ฉด, ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. +- ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ๋ˆ„๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ–ˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์œผ๋‚˜, ๊ถŒํ•œ์ด ์—†์–ด ํ•ด๋‹น ์š”์ฒญ์„ ์ฐจ๋‹จํ•œ ๊ฒƒ์ด๋‹ค. + +## ์„ธ์…˜(Session)๊ณผ ํ† ํฐ(Token) + +- ์„ธ์…˜๊ณผ ํ† ํฐ์€ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•œ ์ดํ›„ ์ƒ์„ฑ๋œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์ „๋‹ฌํ•  ๊ฒƒ์ธ์ง€์— ๊ด€ํ•œ ๋ฐฉ๋ฒ•์ด๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ž์› ์ ‘๊ทผ์— ๋Œ€ํ•œ ์ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. + +### ์„ธ์…˜ + +- ์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ์€ ์‚ฌ์šฉ์ž์˜ ์ธ๊ฐ€ ์ •๋ณด๊ฐ€ ์„ธ์…˜ ์ €์žฅ์†Œ์— ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. +- ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์ธ๊ฐ€ ์ •๋ณด๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ์— ์ €์žฅํ•œ ํ›„ ์„ธ์…˜ ์ €์žฅ์†Œ์˜ ์‹๋ณ„์ž์ธ Session ID๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ „๋‹ฌํ•œ๋‹ค. +- ํด๋ผ์ด์–ธํŠธ ์ธก์€ ๋ฐ›์€ Session ID๋ฅผ ์›น ์Šคํ† ๋ฆฌ์ง€ ํ˜น์€ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๊ณ  ์ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ์š”์ฒญ์‹œ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค. + +### ํ† ํฐ + +- ํ† ํฐ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ์€ ์ธ๊ฐ€ ์ •๋ณด๋ฅผ ์„œ๋ฒ„๊ฐ€ ์ถ”์ ํ•˜์ง€ ์•Š๊ณ , ํ† ํฐ๋งŒ์œผ๋กœ ๊ถŒํ•œ์„ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. +- ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์ธ๊ฐ€ ์ •๋ณด๋ฅผ ๋‹ด์€ Token์„ ๋ฐœํ–‰ํ•œ ํ›„ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ „๋‹ฌํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก์€ ์ „๋‹ฌ๋ฐ›์€ Token์„ ์›น ์Šคํ† ๋ฆฌ์ง€ ํ˜น์€ ์ฟ ํ‚ค์— ์ €์žฅํ•œ๋‹ค. +- ๋Œ€ํ‘œ์ ์ธ ํ† ํฐ์ธ JWT์˜ ๊ฒฝ์šฐ ๋””์ง€ํ„ธ ์„œ๋ช…์ด ์กด์žฌํ•ด ํ† ํฐ์˜ ๋‚ด์šฉ์ด ์œ„๋ณ€์กฐ ๋˜์—ˆ๋Š”์ง€ ์„œ๋ฒ„์ธก์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. + +### ์„ธ์…˜ vs ํ† ํฐ + +1. ์‚ฌ์ด์ฆˆ + - ์„ธ์…˜์˜ ๊ฒฝ์šฐ Session ID๋งŒ ์‹ค์–ด ๋ณด๋‚ด๋ฉด ๋˜๋ฏ€๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ ๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค. + - ํ•˜์ง€๋งŒ JWT๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์™€ ํ† ํฐ์˜ ๋ฐœ๊ธ‰ ์‹œ๊ฐ, ๋งŒ๋ฃŒ ์‹œ๊ฐ, ํ† ํฐ ID ๋“ฑ ๋‹ด๊ฒจ์žˆ๋Š” ์ •๋ณด๊ฐ€ Sesstion ID์— ๋น„ํ•ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์‚ฌ์šฉํ•œ๋‹ค. +2. ์•ˆ์ •์„ฑ๊ณผ ๋ณด์•ˆ + - ์„ธ์…˜์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์ธ์ฆ ์ •๋ณด๋ฅผ ์„œ๋ฒ„ ์ธก์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์กฐ๊ธˆ ๋” ์œ ๋ฆฌํ•˜๋‹ค. + - ์„ธ์…˜ ID๊ฐ€ ํ•ด์ปค์—๊ฒŒ ํƒˆ์ทจ๋‹นํ•œ ๊ฒฝ์šฐ, ์„œ๋ฒ„ ์ธก์—์„œ ํ•ด๋‹น ์„ธ์…˜์„ ๋ฌดํšจ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค. + - ํ•˜์ง€๋งŒ ํ† ํฐ์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„๊ฐ€ ํ† ํฐ์„ ์ถ”์ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋“  ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. + - ๋”ฐ๋ผ์„œ ํ† ํฐ์ด ํ•œ๋ฒˆ ํ•ด์ปค์—๊ฒŒ ํƒˆ์ทจ๋˜๋ฉด ํ•ด๋‹น ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํ”ผํ•ด๋ฅผ ์ž…์„ ์ˆ˜ ์žˆ๋‹ค. +3. ํ™•์žฅ์„ฑ + - ํ˜„์žฌ ๊ฑฐ์˜ ๋ชจ๋“  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ† ํฐ์˜ โ€˜ํ™•์žฅ์„ฑโ€™๋•Œ๋ฌธ์— ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. + - ์ผ๋ฐ˜์ ์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„œ๋ฒ„๋Š” ์ˆ˜ํ‰์ ์œผ๋กœ ํ™•์žฅํ•œ๋‹ค. ์ด๋•Œ, ์—ฌ๋Ÿฌ๋Œ€์˜ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๋ณ„๋„์˜ ์ž‘์—…์„ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์€ ์„ธ์…˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ฒŒ ๋œ๋‹ค. + - ํ•˜์ง€๋งŒ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ์ง์ ‘ ์ธ์ฆ ๋ฐฉ์‹์„ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ๋‹ค! +4. ์„œ๋ฒ„์˜ ๋ถ€๋‹ด + - ์•ž์—์„œ ๋งํ–ˆ ๋“ฏ์ด, ์„ธ์…˜์€ ์„œ๋ฒ„๊ฐ€ ์ง์ ‘ ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผํ•˜๋Š” ๋ฐ˜๋ฉด ํ† ํฐ์€ ์„œ๋ฒ„๊ฐ€ ์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ๋ถ€๋‹ด์ด ํ™•์‹คํžˆ ์ ๋‹ค. + + ## Access Token ๊ธฐ๋ฐ˜ JWT ํ† ํฐ ๋ฌธ์ œ + +- Access Token๋งŒ์„ ์ด์šฉํ•ด์„œ ์ธ์ฆ ์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด, ์œ ํšจ ๊ธฐ๊ฐ„ ๋‚ด์— ํ† ํฐ์„ ํƒˆ์ทจ ๋‹นํ•  ์œ„ํ—˜์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋‹ค. +- ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ํƒˆ์ทจํ•œ ์‚ฌ๋žŒ์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์ปค๊ฐ€ ํ† ํฐ์„ ์•…์šฉํ•œ๋‹ค๋ฉด ๋ณด์•ˆ์ƒ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค! + +โ†’ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ํ•ด๋‘๊ณ , Refresh Token์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. + +## Refresh Token + +- ํ†ต์‹ ์ด ๋นˆ๋ฒˆํ•œ Access Token์€ ํƒˆ์ทจ๋‹นํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์—, ์œ ํšจ๊ธฐ๊ฐ„์ด ๊ธด Access Token์„ ๊ฐ™์ด ๋ฐœ๊ธ‰ํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ์ปฌ์— ์ €์žฅํ•ด ๋‘๋„๋ก ํ•œ๋‹ค. +- ํด๋ผ์ด์–ธํŠธ๋Š” ํ—ค๋”์— Access token์„ ๋‘๊ณ  ํ†ต์‹ ์„ ํ•˜๋Š”๋ฐ, Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ํ—ค๋”์— Refresh Token์„ ๋„ฃ๊ณ  ์žฌ์š”์ฒญ์„ ๋ณด๋‚ด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. + +### ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ํ†ต์‹  + +1. ๋กœ๊ทธ์ธ ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” Refresh Token๊ณผ Access Token ๋‘ ๊ฐœ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š”๋‹ค. +2. ํด๋ผ์ด์–ธํŠธ๋Š” ๋กœ์ปฌ์— ๋‘ ๊ฐœ์˜ ํ† ํฐ์„ ์ €์žฅํ•ด๋‘”๋‹ค. +3. ํด๋ผ์ด์–ธํŠธ๋Š” ํ—ค๋”์— Access Token์„ ๋„ฃ๊ณ  API ํ†ต์‹ ์„ ํ•œ๋‹ค. +4. ์ผ์ • ๊ธฐ๊ฐ„์ด ์ง€๋‚˜ Access Token์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— Refresh Token์„ ๋ณด๋‚ด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. (๋ณ„๋„์˜ API) +5. ๋งŒ์•ฝ Refresh Token๋„ ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ์„œ๋ฒ„๋Š” 401 Error Code๋ฅผ ๋ณด๋‚ด๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ์žฌ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•œ๋‹ค. \ No newline at end of file