Spring์—์„œ ์บ์‹œ ์‚ฌ์šฉํ•˜๊ธฐ: CaffeineCache, @Cacheable, @CachePut, @CacheEvict
ยท
๐ŸŒฟSpring
๐Ÿ”– ๋จผ์ € ์ฝ์œผ๋ฉด ์ข‹์€ ๊ธ€ ๋กœ์ปฌ ์บ์‹œ & ๋ถ„์‚ฐ ์บ์‹œ ์ดํ•ดํ•˜๊ธฐ๐Ÿ”– ๋จผ์ € ์ฝ์œผ๋ฉด ์ข‹์€ ๊ธ€ ์บ์‹œ(Cache) ๊ฐœ๋… ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•˜๊ธฐ๐Ÿš€ ์บ์‹œ(Cache)๋ž€?์ง€๊ธˆ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง์ ‘ ์กฐํšŒํ•ด์™”์Šต๋‹ˆ๋‹ค.๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•ด๋ดค๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์€ I/O ์ž‘syleeblog.tistory.com์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์บ์‹œ์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ ๊ธ€๋“ค์—์„œ ์บ์‹œ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์— ๋กœ์ปฌ ์บ์‹œ๋ฅผ ์ ์šฉํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.๋Œ€ํ‘œ์ ์ธ ๋กœ์ปฌ ์บ์‹œ Caffeine์„ ์ ์šฉํ•˜๊ณ , `@Cacheable`, `@CachePut`, `@CacheEvict`์™€ ๊ฐ™์€ ์Šคํ”„๋ง์˜ ์บ์‹œ ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค.โš™๏ธ ํ™˜๊ฒฝSpringBoot 3.4.0build...
JWT(Json Web Token) ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ
ยท
๐ŸŒฟSpring
JWT (JSON Web Token) ์ด๋ž€JWT(JSON Web Token)์ด๋ž€ ์œ ์ €๋ฅผ ์ธ์ฆํ•˜๊ณ  ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ JSON ํ† ํฐ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.์ด ํ† ํฐ ๋‚ด์—๋Š” ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ •๋ณด์™€ ๊ฐ™์€ ์ธ์ฆ ์ •๋ณด๊ฐ€ Base64 URL ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ† ํฐ์„ HTTP ํ—ค๋”์— ์‹ค์–ด ์‘๋‹ต์„ ๋ณด๋‚ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.JWT ๊ตฌ์กฐJWT๋Š” ์„ธ ํŒŒํŠธ๋กœ ๋‚˜๋ˆ„์–ด์ง€๋ฉฐ, ๊ฐ ํŒŒํŠธ๋Š” ์ ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.ํ—ค๋”(Header), ํŽ˜์ด๋กœ๋“œ(Payload), ์„œ๋ช…(Signature)์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.ํ—ค๋”(Header)ํ—ค๋”์—๋Š” ํ•ด์‹œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ† ํฐ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.์•Œ๊ณ ๋ฆฌ์ฆ˜: ์„œ๋ช… ์ƒ์„ฑ์— ์‚ฌ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜ex) HS256, RS256ํƒ€์ž…: ํ† ํฐ์˜ ํƒ€์ž…, ์—ฌ๊ธฐ์„œ๋Š” JWT๊ฐ€ ๋˜์ฃ .ํŽ˜..
[Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #2 ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, JWT ํ† ํฐ ํƒˆ์ทจ + ๋Œ€์‘ ์ „๋žต
ยท
๐ŸŒฟSpring
1ํŽธ: https://syleeblog.tistory.com/51 [Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #1: CSRF๊ณต๊ฒฉ๊ณผ XSS ๊ณต๊ฒฉ + ๋Œ€์‘ ์ „๋žต์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” 4๊ฐ€์ง€ ์ฃผ์š” ๋ณด์•ˆ ๊ณต๊ฒฉ: CSRF ๊ณต๊ฒฉ, XSS ๊ณต๊ฒฉ, ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, JWT ํƒˆ์ทจ ๊ณต๊ฒฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ,์ด๋ฅผ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š” Spring Security ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋Œ€์‘ ์ „๋žต์„ ์‚ดํŽดsyleeblog.tistory.com ๐Ÿ“Œ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์„ธ์„  ID๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•ด๋†“๊ณ , ํ”ผํ•ด์ž๊ฐ€ ๊ทธ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋งŒ๋“  ๋’ค,ํ”ผํ•ด์ž๊ฐ€ ๊ฐ™์€ ์„ธ์…˜์œผ๋กœ ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ ํ”ผํ•ด์ž์˜ ๊ถŒํ•œ์„ ํƒˆ์ทจํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์„ธ์…˜ ID๋ฅผ ๋จผ์ € ๋งŒ๋“  ์‚ฌ๋žŒ์ด ๋กœ๊ทธ์ธ ํ›„์—๋„ ๊ณ„์† ๊ทธ ์„ธ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด,๊ณต๊ฒฉ์ž๋Š” ํ”ผํ•ด์ž์˜..
[Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #1: CSRF๊ณต๊ฒฉ๊ณผ XSS ๊ณต๊ฒฉ + ๋Œ€์‘ ์ „๋žต
ยท
๐ŸŒฟSpring
์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” 4๊ฐ€์ง€ ์ฃผ์š” ๋ณด์•ˆ ๊ณต๊ฒฉ: CSRF ๊ณต๊ฒฉ, XSS ๊ณต๊ฒฉ, ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, JWT ํƒˆ์ทจ ๊ณต๊ฒฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ,์ด๋ฅผ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š” Spring Security ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋Œ€์‘ ์ „๋žต์„ ์‚ดํŽด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ธ€์ด ๊ธธ์–ด์ ธ์„œ ๋‘ ํŽธ์— ๋‚˜๋ˆ„์–ด ์”๋‹ˆ๋‹ค.๐Ÿ“Œ CSRF ๊ณต๊ฒฉCSRF๋Š” Cross-Stie Request Forgery์˜ ์ค„์ž„๋ง๋กœ "์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„๋ฅผ ํŠน์ •ํ•œ ์›น ์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. CSRF ๊ณต๊ฒฉ์ด ์„ฑ๊ณตํ•˜๋ ค๋ฉด 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.์‚ฌ์šฉ์ž๋Š” ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.ํ•ด์ปค(๊ณต๊ฒฉ์ž)๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.ํ•ด์ปค(๊ณต๊ฒฉ์ž) ๋Š” ์„œ..
[Spring Security] Role Hierarchy: ๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ ๊ฐœ๋… ์ •๋ฆฌ & ์ ์šฉ
ยท
๐ŸŒฟSpring
๋“ค์–ด๊ฐ€๋ฉด์„œ ๊ธฐ์กด์˜ ๋””์Šค์ฝ”๋“œ์ž‡ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ด€๋ฆฌ์ž, ์œ ์ € ๊ตฌ๋ถ„ ์—†์ด๋กœ๊ทธ์ธํ•˜๋ฉด ๋ˆ„๊ตฌ๋‚˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ role์„ ์ •์˜ํ•˜๊ณ , role์— ๋”ฐ๋ผ ํ–‰๋™์„ ์ œํ•œํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ์ด๋ฅผ ์ฝ”๋“œ์— ์ ์šฉํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.๊ฐœ๋ฐœ ํ™˜๊ฒฝSpring Boot 3.4.0Spring Security 6.4.1๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ Role HierarchySpring Security์˜ ๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ(Role Hierarchy) ๋Š” ์—ญํ• (Role) ๊ฐ„์˜ ํฌํ•จ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.ํšŒ์‚ฌ์—์„œ ์‚ฌ์žฅ์ด ๋ถ€์žฅ์˜ ๋ชจ๋“  ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ , ๋ถ€์žฅ์ด ์‚ฌ์›์˜ ๊ถŒํ•œ์„ ๋ชจ๋‘ ๊ฐ€์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ,๋” ๋†’์€ ์—ญํ• ์ด ๋” ๋‚ฎ์€ ์—ญํ• ์˜ ๊ถŒํ•œ์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™œ R..
[Spring Security] ์ปค์Šคํ…€ ํ•„ํ„ฐ ๊ตฌํ˜„ํ•˜๊ธฐ / UsernamePasswordAuthenticationFilter ๋ฐ”ํƒ•
ยท
๐ŸŒฟSpring
โš™๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝSpring Boot 3.4.0Spring Security 6.4.1 ๐Ÿš€ ๋ชฉํ‘œ๋””์Šค์ฝ”๋“œ์ž‡ ๋ฏธ์…˜์—์„œ ๊ธฐ์กด์—๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ์ธ์ฆ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.username, password๋ฅผ DB์— ์ €์žฅํ•˜๊ณ , ๋กœ๊ทธ์ธ ์‹œ์—๋Š” ๊ทธ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋น„๊ตํ•˜์—ฌ ์‘๋‹ต์„ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” Spring Security์—์„œ ์ปค์Šคํ…€ ํ•„ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋กœ๊ทธ์ธ ์‹œ ํ•„ํ„ฐ์—์„œ ์ธ์ฆํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋กœ๊ทธ์ธ API์ธ POST /api/login๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿซ ์ธ์ฆ ์•„ํ‚คํ…์ฒ˜: UsernamePasswordAuthenticationFilter๋ฅผ ์ค‘์‹ฌ์œผ๋กœ๋จผ์ € ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ์ธ์ฆ๋˜๊ณ  ์žˆ๋Š”์ง€ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.username, password๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์œ ์ง€ํ•˜๋ฏ€๋กœUsernam..
[Spring Security] CSRF ์„ค์ • 403 ์‘๋‹ต ๋ฌธ์ œ ํ•ด๊ฒฐ: CsrfTokenRepository์— ๋Œ€ํ•œ ์ดํ•ด
ยท
๐ŸŒฟSpring
โš™๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝSpring Boot 3.4.0Spring Security 6.4.1 ๐Ÿ“Œ ๋ฌธ์ œ ์ƒํ™ฉ๋””์Šค์ฝ”๋“œ์ž‡ ๋ฏธ์…˜์— Spring Security๋ฅผ ์ ์šฉํ•˜๋ฉฐ CSRF ๋ณดํ˜ธ ์„ค์ •์„ ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์˜ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์„œ๋ฒ„์—์„œ HTML์„ ๋ชจ๋‘ ์ƒ์„ฑํ•˜๋Š” SSR(Sever Side Rendering) ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ,ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ Javascript๋ฅผ ํ™œ์šฉํ•ด HTML์„ ์ƒ์„ฑํ•˜๋Š” CSR(Client Side Rendering) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— CSRF ํ† ํฐ ์ •๋ณด ์—ญ์‹œ ํ”„๋ก ํŠธ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. CSRF ํ† ํฐ ๋ฐœ๊ธ‰ ๋ฐ ๊ฒ€์ฆ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 1. ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ CSRF ํ† ํฐ ๋ฐœ๊ธ‰2. CSRF ํ† ํฐ..
[Spring Security] SecurityFilterChain ํ•„ํ„ฐ ๋ชฉ๋ก ํ™•์ธํ•˜๊ธฐ (๋””๋ฒ„๊น…/๋กœ๊ทธ)
ยท
๐ŸŒฟSpring
์ด๋ฒˆ์— ํ•˜๊ณ  ์žˆ๋Š” ๋””์Šค์ฝ”๋“œ์ž‡ ๋ฏธ์…˜์—์„œSpring Security๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ SecurityFilterChain์„ ๋“ฑ๋กํ•˜๊ณ , ์ด๋•Œ ๋“ฑ๋ก๋˜๋Š” ํ•„ํ„ฐ ๋ชฉ๋ก์„ ๋””๋ฒ„๊น…ํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.๊ตฌ๊ธ€๋ง ๊ฒฐ๊ณผ ๋””๋ฒ„๊น… ์™ธ์—๋„ ๋กœ๊ทธ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์„œ ์˜ค๋Š˜์€ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•„ํ„ฐ ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. Spring Boot 3.4.0 / Spring Security 6.4.1 ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.๋‹ค์Œ๊ณผ ๊ฐ™์ด build.gradle์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.// spring securityimplementation("org.springframework.boot:spring-boot-starter-security")testImplementation("org.springframework.securi..
[Spring Security] #2 ์ธ์ฆ ๋ฐฉ์‹: ์ฟ ํ‚ค vs ์„ธ์…˜ vs JWT
ยท
๐ŸŒฟSpring
์˜ค๋Š˜์€ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐฉ์‹์ธ ์ฟ ํ‚ค vs ์„ธ์…˜ vs JWT ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.์ œ๊ฐ€ ๋“ค์€ ๊ฐ•์˜์—์„œ๋Š” ์„ธ์…˜๊ณผ ์ฟ ํ‚ค๋ฅผ ํ•ฉ์ณ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ๋ธ”๋กœ๊ทธ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด ์ž๋ฃŒ ์กฐ์‚ฌ๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ ์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ๊ตฌ๋ถ„์ง“๋Š” ๋ถ„๋“ค์ด ๋งŽ์œผ์‹œ๋”๋ผ๊ณ ์š”.์ถ”๊ฐ€์ ์œผ๋กœ ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•˜์—ฌ ์จ๋ด…๋‹ˆ๋‹ค. ๋จผ์ € ์ฝ์œผ๋ฉด ์ข‹์€ ๊ธ€: ์ธ์ฆ๊ณผ ์ธ๊ฐ€ ๊ฐœ๋… https://syleeblog.tistory.com/40 ๐Ÿช ์ฟ ํ‚ค ๋ฐฉ์‹์›น์—์„œ ์ฟ ํ‚ค๋ž€ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค.๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ์ดํ„ฐ ์กฐ๊ฐ๋“ค์„ ์ €์žฅํ•ด ๋†“์•˜๋‹ค๊ฐ€, ๋™์ผํ•œ ์„œ๋ฒ„์— ์žฌ ์š”์ฒญ ์‹œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ฒŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.์ถœ์ฒ˜: MDN WEB DOCS 1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ์ธ์ฆ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.2. ์„œ๋ฒ„์—์„œ๋Š” ์ ํ•ฉํ•œ ์œ ์ €์ธ์ง€ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.3. ์ธ์ฆ์ด ์™„..