๐Ÿ“•CS

Access Token๊ณผ Refresh Token์˜ ์ €์žฅ ์œ„์น˜

stonesy 2024. 10. 28. 23:02
728x90

1๋…„ ์ „์— ํ•œ์ฐธ ์กธ์—… ํ”„๋กœ์ ํŠธ, ์ฐฝ์—…๋™์•„๋ฆฌ ํ™œ๋™์„ ํ•˜๋ฉด์„œ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ, JWT ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ, Access Token๊ณผ Refresh Token์˜ ๊ฐœ๋…์„ ๊ณต๋ถ€ํ–ˆ์—ˆ๋‹ค. ์˜ค๋Š˜ ์ž์œจ ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๋งก์•„ ์˜ค๋žœ๋งŒ์— ๋‹ค์‹œ ์ƒ๊ฐ๋‚˜์„œ ์ •๋ฆฌํ•ด๋ณธ๋‹คใ…Žใ…Ž
 
์šฐ์„ , ์›น์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋ฌด์ƒํƒœ(stateless)๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋กœ๊ทธ์ธ ๊ณผ์ •์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค. HTTP ํ”„๋กœํ† ์ฝœ ์ž์ฒด๊ฐ€ ๋ฌด์ƒํƒœ(stateless)ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๊ฐ ์š”์ฒญ์„ ๋…๋ฆฝ๋œ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ, JWT ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ์ธ ๊ฒƒ์ด๋‹ค.
 
์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ์—๋Š” ์„ธ์…˜ ID๋งŒ ์ €์žฅํ•˜๊ณ  ์„œ๋ฒ„์— ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ์„ธ์…˜ ID ์ž์ฒด์—๋Š” ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ์˜ ์ธก๋ฉด์—์„œ๋Š” ๋น„๊ต์  ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์„œ๋ฒ„์— ์ €์žฅํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์ปค์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
 
JWT ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ Access Token๊ณผ Refresh Token์„ ๋“ค๊ณ  ์žˆ๋Š”๋‹ค. ์„œ๋ฒ„๋Š” Access Token์˜ ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ช…์„ ๊ฒ€์ฆํ•˜์—ฌ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘์š”ํ•œ ๋‚ด์šฉ์„ ํฌํ•จํ•œ Access Token์ด ํƒˆ์ทจ๋˜๋ฉด ์œ„ํ—˜์ด ํฌ๋ฏ€๋กœ Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•˜๊ณ  ํ•„์š” ์‹œ Refresh Token์„ ํ†ตํ•ด ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ์ „๋žต์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ Refresh Token ๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅ๋˜๋ฏ€๋กœ ํƒˆ์ทจ๋  ์œ„ํ—˜์ด ์žˆ์œผ๋ฉฐ, Access Token๊ณผ Refresh Token ๋ชจ๋‘ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด์™€ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํƒˆ์ทจ๋˜์ง€ ์•Š๋„๋ก ๋ณด์•ˆ์„ ์‹ ๊ฒฝ์“ฐ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

  ์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ํ† ํฐ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ
๋ณด์•ˆ์„ฑ ์„œ๋ฒ„์— ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ์•ˆ์ „ํ•˜๋‹ค. ํด๋ผ์ด์–ธํŠธ์— ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋ฏ€๋กœ ๋ณด์•ˆ์— ์‹ ๊ฒฝ์จ์•ผ ํ•œ๋‹ค.
ํ™•์žฅ์„ฑ ๋น„๊ต์  ์ œํ•œ์ ์ด๋‹ค ๋น„๊ต์  ๋†’๋‹ค
์ƒํƒœ ์œ ์ง€ ์„œ๋ฒ„๊ฐ€ ์ƒํƒœ ๊ด€๋ฆฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒํƒœ ๊ด€๋ฆฌ
๋กœ๊ทธ์•„์›ƒ ๊ด€๋ฆฌ ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ๋งŒ๋ฃŒ ๊ฐ€๋Šฅ ์ฆ‰๊ฐ์  ๋ฌดํšจํ™” ์–ด๋ ค์›€

 
๊ทธ๋ ‡๋‹ค๋ฉด Access Token๊ณผ Refresh Token์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์–ด๋””์— ์ €์žฅํ•˜๋ฉด ์ข‹์„๊นŒ?
์˜ค๋Š˜ ์ด๋Ÿฌํ•œ ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.
1. Cookie๊ฐ€ localStorage๋ณด๋‹ค๋Š” ์•ˆ์ „ํ•˜๋‹ค.
2. ๊ทธ๋ ‡๋‹ค๋ฉด Access Token๊ณผ Refresh Token์„ ๋ชจ๋‘ Cookie์— ์ €์žฅํ•ด๋„ ๋˜๋Š”๊ฐ€? 
 
์ฟ ํ‚ค๊ฐ€ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ณด๋‹ค ์•ˆ์ „ํ•œ ์ด์œ ๋Š” ๋‹ค์Œ 3๊ฐ€์ง€ ์ด์œ ์—์„œ XSS, CSRF ๊ณต๊ฒฉ์— ๋” ์ž˜ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์–ด์„œ์ด๋‹ค.
- HttpOnly ์†์„ฑ: ์ฟ ํ‚ค์— HttpOnly ์†์„ฑ์„ ์ ์šฉํ•˜๋ฉฐ JavaScript๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์–ด, XSS ๊ณต๊ฒฉ์— ๋” ์ž˜ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ณต๊ฒฉ์„ ๋ฐ›๋”๋ผ๋„ ์ฟ ํ‚ค๋ฅผ ํƒˆ์ทจ๋‹นํ•  ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
XSS ๊ณต๊ฒฉ์ด๋ž€? Cross-Site-Scripting ๊ณต๊ฒฉ์œผ๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ํ˜น์€ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. HttpOnly ์†์„ฑ์€ ๊ณต๊ฒฉ์ž๊ฐ€ JavaScript๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํƒˆ์ทจ๋‹นํ•  ์œ„ํ—˜์„ ์ค„์ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
- Secure ์†์„ฑ: ์ฟ ํ‚ค์— Secure ์†์„ฑ์„ ์„ค์ •ํ•˜๋ฉด HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก๋˜๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
- SameSite ์†์„ฑ: ์ฟ ํ‚ค์— SameSite ์†์„ฑ์„ ์„ค์ •ํ•˜๋ฉด ๋™์ผ ์ถœ์ฒ˜ ๋‚ด์—์„œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด CSRF ๊ณต๊ฒฉ์— ๋น„๊ต์  ์ž˜ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
CSRF ๊ณต๊ฒฉ์ด๋ž€? Cross-Site Request Forgery์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋œ ์ƒํƒœ์ž„์„ ์•…์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํƒˆ์ทจ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
 

1. XSS(Cross-Site-Scripting) ๊ณต๊ฒฉ
: ์ฃผ๋กœ ๋ณ€์กฐ ํ˜น์€ ์œ„์กฐ ๊ณต๊ฒฉ์— ํ•ด๋‹นํ•œ๋‹ค.
: ํด๋ผ์ด์–ธํŠธ ์ธก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์•…์˜์ ์œผ๋กœ ์กฐ์ž‘ํ•œ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์˜ JS, HTML ๋“ฑ์„ ์•…์˜์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ด ๊ณต๊ฒฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ† ํฐ์„ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ฟ ํ‚ค์— HTTPOnly ์„ค์ •์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด JavaScript๋ฅผ ํ†ตํ•ด์„œ ์ฟ ํ‚ค๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. localStorage ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” XSS ๊ณต๊ฒฉ์— ๋งค์šฐ ์ทจ์•ฝํ•˜๋‹ค.

1. CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ
: ์ฃผ๋กœ ์œ„์กฐ ๊ณต๊ฒฉ ์œ ํ˜•์— ํ•ด๋‹นํ•œ๋‹ค.
: CSRF๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์‹ ๋ขฐ๋œ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชฐ๋ž˜ ์˜๋„ํ•˜์ง€ ์•Š์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ์•…์˜์ ์ธ ์‚ฌ์ดํŠธ(๋„๋ฉ”์ธ)์— ์š”์ฒญ์„ ๋ณด๋‚ด ์˜๋„ํ•˜์ง€ ์•Š์€ ์ž‘์—…์„ ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฟ ํ‚ค์— SameSite ์†์„ฑ์„ ์ ์šฉํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์œผ๋กœ์˜ ์ฟ ํ‚ค ์ „์†ก์„ ๋ง‰์•„ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด Access Token๊ณผ Refresh Token์„ ๋ชจ๋‘ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์ธ๊ฐ€?
Access Token๊ณผ Refresh Token์„ ๋ชจ๋‘ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋ฉด ๋™์‹œ์— ํƒˆ์ทจ๋‹นํ•  ์ˆ˜๋„ ์žˆ์–ด ์œ„ํ—˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋”ฐ๋กœ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ Access Token์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ , Refresh Token์€ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ์— ๋งค๋ฒˆ Access Token์ด ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์กฐ๊ธˆ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Access Token์€ localStorage์— Rrefresh Token์€ ์ฟ ํ‚ค์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋”ฐ๋กœ ์ €์žฅํ•˜๋ฉฐ ํ† ํฐ์ด ๋™์‹œ์— ํƒˆ์ทจ๋‹นํ•  ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , Access Token์ด ํƒˆ์ทจ๋‹นํ•˜๋”๋ผ๋„ ๋น„๊ต์  ์œ ํšจ ๊ธฐ๊ฐ„์ด ์งง๊ธฐ ๋•Œ๋ฌธ์— ํ”ผํ•ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ localStorage์— Cookie์— ๋น„ํ•ด ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ ๊ฒƒ์€ ์‚ฌ์‹ค์ด๊ณ , ์œ„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ณด์•ˆ ์œ„ํ˜‘์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
 
๊ฒฐ๋ก ์ ์œผ๋กœ ๋งŽ์€ ๊ธ€์„ ์ฝ์–ด๋ณด์•˜์„ ๋•Œ ์™„๋ฒฝํ•œ ๋ณด์•ˆ์€ ์—†๋‹ค๋ผ๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. JWT๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•œ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋ณด์•ˆ์˜ ์œ„ํ˜‘์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ์ˆ˜๋Š” ์—†๊ณ , ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.(์‚ฌ์‹ค ์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ด๋„ ๋ณด์•ˆ์—๋Š” ์‹ ๊ฒฝ์จ์•ผ ํ•œ๋‹ค.) ๋”ฐ๋ผ์„œ Access Token๊ณผ Refresh Token์„ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ• ์ง€ ๊ณ ๋ฏผํ•˜๊ณ , ํƒˆ์ทจ๋ฅผ ๋Œ€๋น„ํ•˜๋Š” ๋ฐฉ์•ˆ์„ ๋งˆ๋ จํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Refresh Token Rotation(RTR - Refresh Token์„ ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Refresh Token์„ ๋ฐœ๊ธ‰ํ•˜๊ณ  ์ด์ „ ํ† ํฐ์„ ๋ฌดํšจํ™”ํ•˜๋Š” ๋ฐฉ์‹)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Refresh Token์œผ๋กœ Access Token์„ ์žฌ๋ฐœ๊ธ‰ํ•  ๋•Œ ๋‹ค์ค‘ ์ธ์ฆ(MFA)์„ ๋„์ž…ํ•ด ๊ณต๊ฒฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณด์•ˆ ์กฐ์น˜๋“ค์„ ํ†ตํ•ด ์ž ์žฌ์ ์ธ ์œ„ํ˜‘์— ์ตœ๋Œ€ํ•œ ๋Œ€๋น„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
 
์ฐธ๊ณ 
https://seungyong20.tistory.com/entry/JWT-Access-Token%EA%B3%BC-Refresh-Token-%EA%B7%B8%EB%A6%AC%EA%B3%A0-RTR-%EA%B8%B0%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

728x90