๐Ÿ–

Axios compromised on npm

๊ฐœ์š” 2026๋…„ 3์›” 30์ผ(ํ˜„์ง€ ์‹œ๊ฐ„), ์ฃผ๋‹น 1์–ต ํšŒ ์ด์ƒ์˜ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” HTTP ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Axios์˜ NPM ๊ณ„์ •์ด ํ•ดํ‚น๋˜์—ˆ๋‹ค. ์š”์•ฝํ•˜๋ฉด, Axios ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ํƒˆ์ทจํ•˜๊ณ  plain-crypto-js๋ผ๋Š” ๊ฐ€์งœ ์˜์กด์„ฑ์ด ์ถ”๊ฐ€๋œ [email protected] ๋ฐ [email protected] ๋ฒ„์ „์„ ๋ฐฐํฌํ–ˆ๋‹ค. ์ž์„ธํ•œ ๊ฑด ์•„๋ž˜ ์‚ฌ์ดํŠธ์— ์ •๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ฐœ๋ฐœ์ž๋กœ์„œ ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•ด์•ผ ํ• ์ง€๋ฅผ ์ค‘์ ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํƒ€์ž„๋ผ์ธ StepSecurity SK์‰ด๋”์Šค ๋Œ€์‘ ์ „๋žต 1. npm install ์‹œ --ignore-scripts ์˜ต์…˜์„ ์‚ฌ์šฉ ์ด๋ฒˆ ์‚ฌํƒœ์— ํ•ต์‹ฌ ์›์ธ์ด๊ธฐ๋„ ํ–ˆ๋˜ ์ž๋™ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋ง‰๋Š” ์˜ต์…˜์ด๋‹ค. ํ”„๋กœ์ ํŠธ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๋ฌด์ง€์„ฑ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ๋„ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. ...

April 11, 2026 16:18 ยท 1 min ยท 202 words ยท nakji

What Happened to Claude? A Timeline of Service Disruptions

๊ฐœ์š” ์ตœ๊ทผ Claude๊ฐ€ 2์›” ๋ง๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์˜ค๋Š˜๊นŒ์ง€ ์ž” ๋ฒ„๊ทธ(?) ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค. ๋ฌด์Šจ ๋ฌธ์ œ๊ธธ๋ž˜ ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์•„๋„ ๋‹ค์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ์‹œ๊ธฐ๊ฐ€ ๋ฏธ๊ตญ-์ด๋ž€ ์ „์Ÿ๊ณผ ๋งž๋ฌผ๋ ค ์žˆ์–ด์„œ AWS ์ค‘๋™ ๋ฆฌ์ „ ์ด์Šˆ, ๊ตฐ์‚ฌ ์ž‘์ „์— Claude๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆํ–ˆ๋‹ค๋Š” ๋ง๋„ ๋งŽ์ด ๋‚˜์˜ค๊ณ  ์žˆ๋‹ค. Uptime over the past 90 days Claude Status ์š”์•ฝ ์‚ฌ๊ฑด ์ด๋ ฅ์„ ํ™•์ธํ•ด ๋ดค์„ ๋•Œ, 3์›” 1์ผ์—๋Š” ํŠน๋ณ„ํ•œ ์ด์Šˆ๊ฐ€ ์—†๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ, 3์›” 1์ผ ์ „ํ›„๋กœ ์‚ดํŽด๋ณด๊ฒ ๋‹ค. 2์›” ์—ฌ๋Ÿฌ ์žฅ์• ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋Œ€ํ‘œ์ ์œผ๋กœ 3๊ฐ€์ง€๋กœ ์š”์•ฝ๋œ๋‹ค. ...

March 3, 2026 23:31 ยท 2 min ยท 395 words ยท nakji

Cloudflare is down Again: What is the root cause this december?

๊ฐœ์š” 2025๋…„ 11์›” 18์ผ์— ์ด๋ฏธ ์žฅ์• ๊ฐ€ ํ•œ ๋ฒˆ ๋‚ฌ๋Š”๋ฐ, 2์ฃผ๊ฐ€ ์ข€ ์ง€๋‚œ ์˜ค๋Š˜ ๋˜ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋‹คํ–‰ํžˆ ์„ค์ • ๋ณ€๊ฒฝ ์งํ›„ ๊ณง๋ฐ”๋กœ ๊ฐ์ง€๊ฐ€ ๋˜์–ด์„œ ์žฅ์•  ๋ฐœ์ƒ ํ›„, ์•ฝ 25๋ถ„๋งŒ์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค. ์žฅ์•  ์›์ธ ์ด๋ฒˆ ์ฃผ ๊ณต๊ฐœ๋œ React Server Components ๊ด€๋ จํ•˜์—ฌ WAF์˜ ์š”์ฒญ ํŒŒ์‹ฑ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝ ์ค‘์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ณ€๊ฒฝ ์ดํ›„, cloudflare ๋„คํŠธ์›Œํฌ ์ „์ฒด์ ์œผ๋กœ ๋‹ค์šด๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. Resolved This incident has been resolved. A change made to how Cloudflareโ€™s Web Application Firewall parses requests caused Cloudflareโ€™s network to be unavailable for several minutes this morning. This was not an attack; the change was deployed by our team to help mitigate the industry-wide vulnerability disclosed this week in React Server Components. We will share more information as we have it today. Dec 05, 2025 - 09:20 UTC ...

December 5, 2025 18:01 ยท 5 min ยท 906 words ยท nakji

์ฟ ํŒก 3370๋งŒ ๊ฐœ ๋„˜๋Š” ๊ณ„์ • ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ์ด๋ผ ํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค์€ 3์ฒœ๊ฐœ?

๊ฐœ์š” 2025๋…„ 11์›” 29์ผ 17์‹œ 53๋ถ„๊ฒฝ ๋ฌธ์ž ๋ฉ”์‹œ์ง€๋กœ ๊ฐœ์ธ์ •๋ณด ๋…ธ์ถœ ํ†ต์ง€๋ฅผ ๋ฐ›์•˜๋‹ค. ์†”์งํžˆ ์ด๋Ÿฐ ์‚ฌ๊ฑด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋‚˜๋Š” ์šด ์ข‹๊ฒŒ ๋Œ€์ƒ์ž๊ฐ€ ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ํ”ผํ•ด ๋Œ€์ƒ์ž๊ฐ€ ๋˜์—ˆ๋‹ค. ๋ฌธ์ž ๋ฉ”์‹œ์ง€์™€ ์ฟ ํŒก FAQ ๋‚ด์šฉ์œผ๋กœ ํ˜„ ํ”ผํ•ด์ž๋Š” ์•ฝ 4500๋ช…์œผ๋กœ ์ธ์ง€ํ–ˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, 18์‹œ ์ดํ›„์— ๋‚˜์˜จ ๋‰ด์Šค๋ฅผ ํ†ตํ•ด ํ”ผํ•ด์ž๊ฐ€ 3370๋งŒ๋ช…์ด ๋„˜๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋๋‹ค. ์ฟ ํŒก์ด ์‚ฌ๊ฑด์„ ์ธ์ง€ํ•œ ๋‚ ์งœ๋Š” 11์›” 18์ผ์ด์ง€๋งŒ, ์œ ์ถœ์ด ์‹œ์ž‘ํ•œ ์ผ์ž๋Š” 6์›” 24์ผ๋ถ€ํ„ฐ๋กœ ์ถ”์ • ์ค‘์ด๋‹ค. ์ดํ›„ ๊ตญ์ •์›๊ณผ ํ˜‘๋ ฅํ•˜์—ฌ ์กฐ์‚ฌ๋ฅผ ์ง„ํ–‰ํ–ˆ๊ณ , ์œ ์ถœ์ž๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์‚ฌ์‹ค, ์ง„์ˆ ์„œ ๋“ฑ์„ ๋ฐ›์€ ์ฆ‰์‹œ ์ •๋ถ€์— ์ œ์ถœํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐํ˜€์ง„ ๋‚ด์šฉ์ด 3300๋งŒ๋ช…์˜ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ์œ ์ถœ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ๋งŒํผ ์ ‘๊ทผ๋งŒ ํ•œ ๊ฒƒ์ด๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ €์žฅ์€ ์•ฝ 3์ฒœ๊ฐœ๋งŒ ์ €์žฅํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋ฌผ๋ก  ์ด ์—ญ์‹œ ๋ชจ๋‘ ์‚ญ์ œํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ...

November 29, 2025 18:14 ยท 5 min ยท 1054 words ยท nakji

Cloudflare outage: What went wrong?

๊ฐœ์š” AWS ์žฅ์•  ์‚ฌํƒœ๊ฐ€ ์•ฝ ํ•œ ๋‹ฌ์ด ๋˜์–ด๊ฐ€๋Š”๋ฐ Cloudflare์—์„œ๋„ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ•œ๊ตญ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ 20์‹œ 48๋ถ„๊ฒฝ๋ถ€ํ„ฐ Cloudflare๊ฐ€ ์ ์šฉ๋œ ์ผ๋ถ€ ์„œ๋น„์Šค๊ฐ€ ๊ฐ„ํ—์ ์œผ๋กœ 500 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ˜„์žฌ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค๊ฐ€ ๋จนํ†ต์ธ๋ฐ, ๋‚ด ๋ธ”๋กœ๊ทธ๋„ ์ดˆ๋ฐ˜์—๋Š” ๋จนํ†ต์ด์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ ‘์†์ด ์ž˜ ๋˜๊ณ  ์žˆ๋‹ค. 4์‹œ 28๋ถ„๊ฒฝ์— ์žฅ์• ๊ฐ€ ํ•ด๊ฒฐ๋๊ณ  ๊ด€๋ จ ๋‚ด์šฉ์„ ๋ฐœํ‘œํ–ˆ๋‹ค. ์žฅ์•  ์›์ธ ํฌ์ŠคํŒ… ์ž‘์„ฑ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ๋Š” ์•„์ง ๋ช…ํ™•ํ•œ ์›์ธ์ด ๋‚˜์˜ค์ง€ ์•Š์•˜๋‹ค. Cloudflare ์ธก์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์–ด ์ˆ˜์ • ์ž‘์—…์„ ์ง„ํ–‰ ์ค‘์ธ๋ฐ, ์•„๋งˆ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค๊ฐ€ ์•ˆ์ •ํ™”๋์„ ๋•Œ ๋‹ค์‹œ ๋ณด๊ณ ํ•ด ์ฃผ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. ...

November 18, 2025 23:31 ยท 5 min ยท 1031 words ยท nakji

์œˆ๋„์šฐ 10์—์„œ 11๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ์ดํ›„ ์–ด๋А ๋‚  ๋ถ€ํŒ… ์ž์ฒด๊ฐ€ ๋ฉˆ์ถ˜ ์ผ

๊ฐœ์š” ์ทจ์ค€์ƒ ์‹œ์ ˆ ๋‚˜๋Š” ๋จธ์‹ ๋Ÿฌ๋‹์— ๊ด€์‹ฌ์ด ์ƒ๊ฒจ์„œ GPU๊ฐ€ ๋‚˜๋ฆ„ ๋นต๋นตํ•œ ์ŠคํŽ™์œผ๋กœ ๋ฐ์Šคํฌํƒ‘์„ ๊ตฌ๋งคํ–ˆ๋‹ค. ์ง€๊ธˆ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€์ง€๋งŒ ์™œ SSD๋ฅผ 2๊ฐœ๋ฅผ ์ƒ€์„๊นŒ? ๊ทธ๋ƒฅ ์šฉ๋Ÿ‰ ํ•ฉ์นœ ๊ฒƒ์œผ๋กœ 1๊ฐœ ๊ตฌ๋งคํ•˜๋ฉด ๋์„ ํ…๋ฐ. ๊ทธ ๋‹น์‹œ RAID๋ฅผ ์•Œ๊ฒŒ ๋˜๊ณ  ํ•ด๊ฒฐ๋œ ์ค„ ์•Œ์•˜์ง€๋งŒ ์ด๊ฒŒ ์ง€๊ธˆ์—์„œ์•ผ ๋ฌธ์ œ๊ฐ€ ๋ ์ง€๋Š” ํ•œ ๋‹ฌ ์ „๊นŒ์ง€ ๋ชฐ๋ž๋‹ค. ์‚ฌ๊ฑด์˜ ์‹œ์ž‘ 2025๋…„ 9์›”์— TPM ์„ค์ • ํ›„ ์œˆ 11๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ๋‚˜์„œ๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ 10์›”์ด ๋˜๊ณ  ๋ช‡๋ช‡ ์—…๋ฐ์ดํŠธ ์ดํ›„ ๋ถ€ํŒ…์ด ๋ฉˆ์ถ”๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ด๋•Œ๋Š” ๋งˆ์นจ ํ•ด๋‹น ์—…๋ฐ์ดํŠธ ์ „์— ์‹œ์Šคํ…œ ๋ณต์› ์ง€์ ์ด ์ƒ์„ฑ๋˜์–ด ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚ฌ๋‹ค. ...

October 31, 2025 20:04 ยท 2 min ยท 305 words ยท nakji

2025 AWS US-East-1 region outage: DynamoDB down

๊ฐœ์š” Thomas Eccel(๊ตฌ๊ธ€ Ads ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ)์˜ ๊ธ€์„ ํฌํ•จํ•œ ์™ธ๊ตญ ์ €๋„๊ณผ AWS์— Service health ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ๊ตญ ์‹œ๊ฐ„ ๊ธฐ์ค€, 2025๋…„ 10์›” 20์ผ ์˜คํ›„ 4์‹œ ๊ฒฝ๋ถ€ํ„ฐ US-EAST-1 ๋ฆฌ์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์ˆ˜์˜ ์„œ๋น„์Šค์—์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒ ์›์ธ: US-EAST-1 ๋ฆฌ์ „์˜ DynamoDB API ์—”๋“œํฌ์ธํŠธ์˜ DNS ์˜ํ–ฅ: IAM, DynamoDB ํ…Œ์ด๋ธ”์„ ํฌํ•จํ•œ US-EAST-1 ์—”๋“œํฌ์ธํŠธ์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค ์žฅ์•  ์›์ธ ํ•ด๋‹น ๋ฆฌ์ „์˜ DynamoDB API ์—”๋“œํฌ์ธํŠธ์˜ DNS์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๋‚ด์šฉ์ผ๊นŒ? Oct 20 2:01 AM PDT We have identified a potential root cause for error rates for the DynamoDB APIs in the US-EAST-1 Region. Based on our investigation, the issue appears to be related to DNS resolution of the DynamoDB API endpoint in US-EAST-1. We are working on multiple parallel paths to accelerate recovery. ...

October 21, 2025 06:20 ยท 9 min ยท 1878 words ยท nakji

ํ‡ด์‚ฌํ•˜๊ณ  ๊ณต๋ฐฑ๊ธฐ๊ฐ€ 1๋…„์ด ๋„˜์€ ํ˜„์žฌ๊นŒ์ง€์˜ ์ด์•ผ๊ธฐ

๊ฐœ์š” ํ•˜์ด ๋ฆฌ์Šคํฌ์˜€๋˜ ์ฒซ ํ‡ด์‚ฌ ์ดํ›„ ์ง€๊ธˆ๊นŒ์ง€ ์•ฝ 15๊ฐœ์›” ๊ฐ„์˜ ์ด์•ผ๊ธฐ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ปค๋จธ์Šค ๊ด€๋ จ ํšŒ์‚ฌ์— ์•ฝ 4๋…„ ๋ฐ˜๋™์•ˆ ๋‹ค๋‹ˆ๊ณ  ๊ฑด๊ฐ• ๋ฌธ์ œ๋ฅผ ํ‡ด์‚ฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ฑด๊ฐ•์ด ์•…ํ™”๋œ ์ด์œ ๋Š” ์š”์•ฝํ•˜๋ฉด ์ŠคํŠธ๋ ˆ์Šค๋กœ ์ธํ•œ ๊ฑด๊ฐ• ์•…ํ™”์ง€๋งŒ ์ž์„ธํ•œ ์ด์•ผ๊ธฐ๋Š” ๊ฐ€๊นŒ์šด ์ง€์ธ๋“ค๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ์•ฝ 150๊ณณ์˜ ์„œ๋ฅ˜๋ฅผ ๋„ฃ์—ˆ๊ณ  ์ด ์ค‘์—์„œ 50๊ฐœ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์ฃผ์ง€ ์•Š์•˜๋‹ค. ๋ฉด์ ‘์€ 8๋ฒˆ์„ ๋ดค๊ณ , ์ฒ˜์šฐ ํ˜‘์˜๊นŒ์ง€ ๊ฐ„ ๊ณณ์€ 1๊ณณ์ด๋‹ค. 24๋…„ 7์›” ~ 9์›”, ํœด์‹๊ธฐ ์ผ๋‹จ ๋‚ด ๋ชธ ๋จผ์ € ์–ด์จ‹๋“  ํ‡ด์‚ฌ๋ฅผ ํ•˜๊ณ ๋‚˜์„œ ๋งˆ์Œ์ด ํ•œ๊ฒฐ ๊ฐ€๋ณ๊ธด ํ–ˆ์ง€๋งŒ ์œก์ฒด๋Š” ์•„์ง ํ›„์œ ์ฆ์ด ์žˆ์—ˆ๋‚˜๋ณด๋‹ค. ๊ทธ๋ž˜์„œ ์ฒ˜์Œ 2๊ฐœ์›”์€ ์ƒ๊ฐ์„ ๋น„์šฐ๊ณ  ๊ฑด๊ฐ• ํšŒ๋ณต์— ์ง‘์ค‘ํ–ˆ๋‹ค. ์•ˆ๊ทธ๋ž˜๋„ ํ‰์†Œ์— ์ด๊ฒƒ ์ €๊ฒƒ ์žก์ƒ๊ฐ์ด ๋งŽ์€ ํŽธ์ด๋ผ ๋ง˜ ๋จน๊ณ  ์‰ฌ๊ธฐ๋งŒ ํ–ˆ๋‹ค. ...

October 20, 2025 03:04 ยท 9 min ยท 1869 words ยท nakji

์‚ฌ์ฐจ์› ์ฃผ๋จธ๋‹ˆ ํ”„๋กœ์ ํŠธ ๊ทผํ™ฉ 1

๐Ÿ”” ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๊ทผํ™ฉ ๐Ÿ”” ์ถ”ํ›„ ๊ฐœ์„  ๋ฐฉํ–ฅ ์ด์ „ ์š”์•ฝ ์‚ฌ์ฐจ์› ์ฃผ๋จธ๋‹ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ์—๋Š” ๊ฐœ๋ฐœ ๊ณต๋ถ€์šฉ์œผ๋กœ๋งŒ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฉํ–ฅ์„ ์ „ํ™˜ํ–ˆ๋‹ค. ์ด์ „์—๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„(Thymeleaf)์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ณผ ์ผ๋ณ„ ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ์ˆœ์œ„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค. ์ž‘์—… ๋‚ด์šฉ ๊ฐœ์š” ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ API Response ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋ถ€์กฑํ–ˆ๊ณ , ์‹ค์ œ ๋ฐฐํฌ๋ฅผ ํ•ด๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋˜์–ด ๋ฐฉํ–ฅ์„ฑ์„ ์žƒ์€ ์ƒํƒœ์˜€๋‹ค. ๊ทธ๋ž˜์„œ ๊ณผ๊ฐํ•˜๊ฒŒ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ํ”„๋ก ํŠธ์—”๋“œ๋Š” AI์—๊ฒŒ ๋งก๊ธฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ...

August 20, 2025 04:13 ยท 3 min ยท 440 words ยท nakji

Windows์—์„œ WSL ์„ค์น˜ํ•˜๋‹ค๊ฐ€ ์ปดํ“จํ„ฐ ๋ถ€ํŒ…๋„ ๋ชป ํ• ๋ป”ํ•œ ํ›„๊ธฐ

๐Ÿ”” Windows์—์„œ WSL ์„ค์น˜ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ ๊ฐœ์š” ์š”์ฆ˜ ํ”ํžˆ ๋งํ•˜๋Š” โ€œ๋ฐ”์ด๋ธŒ ์ฝ”๋”ฉโ€œ์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์„œ ์ด๊ฒƒ์ €๊ฒƒ ํ•˜๋˜ ์™€์ค‘, Claude์—์„œ Claude Code๋ฅผ ๋ฐœํ‘œํ•œ ๊ฒƒ์„ ๋ณด์•˜๋‹ค. ์ปค์„œ AI๋ฅผ ์ด์šฉํ•œ ๊ฐœ๋ฐœ์€ ๋ดค์ง€๋งŒ Claude Code๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ CLI ๋ฐฉ์‹์ด์–ด์„œ ์‹ ์„ ํ–ˆ๋‹ค. IntelliJ๋‚˜ VSCode์— ํ†ตํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์Šคํฌํƒ‘(Windows)์— ์ ์šฉํ•ด๋ณด๋ ค๊ณ  WSL์„ ์„ค์น˜ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ์ด๋•Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์—ˆ๋‹ค. 1. WSL ์„ค์น˜ WSL(Windows Subsystem for Linux)๋Š” Windows์—์„œ Linux ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๊ฐ€์ƒ๋จธ์‹  ์—†์ด๋„ Windows ์•ˆ์—์„œ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ •๋„๋กœ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค. ...

June 26, 2025 23:30 ยท 2 min ยท 419 words ยท nakji

Jekyll RSS๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, jekyll-feed๋กœ ์ ์šฉํ•ด๋ณด๊ธฐ

Introduction The Atom Syndication Format is an XML language used for web feeds. A web feed (also called โ€™news feedโ€™ or โ€˜RSS feedโ€™) is a data format used for providing users with frequently updated content. Content distributors syndicate a web feed, thereby allowing users to subscribe a channel to it. A typical scenario of web-feed use might involve the following: a content provider publishes a feed link on its site which end users can register with an aggregator program (also called a feed reader or a news reader) running on their own machines. ...

April 9, 2025 02:38 ยท 1 min ยท 173 words ยท nakji

Photopic) ์—ฌ๊ธฐ์„œ ๊ฒฝํ—˜ํ•œ ๊ฐœ๋ฐœ ๋ฌธํ™”

์ด์ „ ํฌ์ŠคํŠธ ๋ฅผ ์ฝ๊ณ  ์˜ค์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝํ—˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ฐœ๋ฐœ ๋ฌธํ™”์˜€๋‹ค. ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ๊ฐ™์€ ๋ฐฑ์—”๋“œ์™€, ๋‹ค๋ฅธ ์ง๊ตฐ๋“ค๊ณผ ์†Œํ†ต์„ ํ•  ๋•Œ ์–ด๋–ค ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ˜‘์—…ํ•˜๋Š”๊ฒŒ ์ด์ „ ์ง์žฅ์—์„œ๋Š” ๊ฒฝํ—˜ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์ด์—ˆ๋‹ค. ์ด์ „ ์ง์žฅ์—์„œ๋Š” ๊ฐœ๋ฐœ ์šฉ์–ด์ง‘์€ ์žˆ์—ˆ์ง€๋งŒ ์ œ๋Œ€๋กœ ์ ์šฉํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์ด ๋งŽ์•˜๊ณ , ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์—†๊ณ  ์•Œ์•„์„œ ์ž˜ ํ–ˆ๊ฒ ์ง€ ํ•˜๋Š” ๋งˆ์ธ๋“œ๋กœ ํ…Œ์ŠคํŠธ๋Š” ์ž‘์—…ํ•œ ์‚ฌ๋žŒ๋งŒ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ค‘์š”ํ•œ ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋‚ด๊ฐ€ 1์ฐจ๋กœ ํ…Œ์ŠคํŠธ ํ›„ PR์„ ์˜ฌ๋ฆด ๋•Œ, ์ „์ฒด ํ”Œ๋กœ์šฐ๋ž‘ ์ค‘์š”ํ•˜๊ฒŒ ๋ดค์œผ๋ฉด ํ•˜๋Š” ๋ถ€๋ถ„๋“ค์„ ์–ธ๊ธ‰ํ•ด์„œ ์š”์ฒญํ–ˆ์—ˆ๋‹ค. ...

April 6, 2025 13:52 ยท 3 min ยท 533 words ยท nakji

Photopic) AWS Lambda๋ฅผ ์™œ ์จ์•ผํ• ๊นŒ?

์ด์ „ ํฌ์ŠคํŠธ ๋ฅผ ์ฝ๊ณ  ์˜ค์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฝ€๋˜ํ”ฝ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งก์€ ์—…๋ฌด ์ค‘ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ์ž‘์—…์„ ํ•˜๋ฉด์„œ ์™œ Lambda๋ฅผ ์“ฐ๊ฒŒ ๋๋Š”์ง€ ๊ธฐ๋กํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ดˆ๊ธฐ ์„ค๊ณ„ (์‹œ์ž‘ ~ 1์ฐจ MVP) ์ธํ”„๋ผ๋Š” AWS ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ ์ด๋ฏธ์ง€ ์ €์žฅ์„ ์œ„ํ•ด S3 ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ด์šฉํ•˜๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ์ƒ๊ธฐ๋ฉด Lambda๋„ ์‚ฌ์šฉํ•˜์ž๋Š” ๊ณ„ํš์ด ์žˆ์—ˆ๋‹ค. ์˜ˆ์‹œ๋กœ ์ถ”ํ›„ ๋ฆฌ์‚ฌ์ด์ง• ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ๋ฉ”์ธ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ณด๋‹ค ๋žŒ๋‹ค์— ๋ฆฌ์‚ฌ์ด์ง•์„ ๋งก๊ธฐ๋Š” ๊ฒƒ์ด ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜์— ์ข‹๋‹ค๊ณ  ํŒ๋‹จ์„ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทœ๋ชจ๊ฐ€ ์ž‘์€ ์„œ๋น„์Šค์—์„œ ๊ตณ์ด Lambda๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ์ถฉ๋ถ„ํžˆ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Lambda๋Š” ์•ˆ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๋˜, 1์ฐจ MVP์—์„œ ์ด๋ฏธ์ง€ ํ™•์žฅ์ž๋ฅผ jpg(jpeg), png, gif๋งŒ ํ—ˆ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋žŒ๋‹ค๋Š” ์“ฐ์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ...

April 5, 2025 12:55 ยท 2 min ยท 298 words ยท nakji

Photopic) ์Šค์œ„ํ”„ 8๊ธฐ ๋‹จ๊ธฐ ํ”„๋กœ์ ํŠธ ํ›„๊ธฐ, ๋ฝ€๋˜ํ”ฝ

๐Ÿ”” ํ”„๋กœ์ ํŠธ ์ฐธ์—ฌ ๊ณผ์ • ๐Ÿ”” ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ ์ฐธ์—ฌ ๊ณ„๊ธฐ ์ด์ „ ์ง์žฅ์—์„œ ๋ ˆ๊ฑฐ์‹œํ•œ ๊ฒฝํ—˜๋งŒ ์žˆ๋‹ค ๋ณด๋‹ˆ ์Šคํ‚ฌ์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด, ๋‚ด ๋ ˆ๋ฒจ์ด ์‹œ์žฅ์—์„œ ์–ด๋А ์ •๋„์ธ์ง€ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ๊ฐ€ํ–ˆ๋‹ค. ์Šค์œ„ํ”„ 8๊ธฐ ํ”„๋กœ๊ทธ๋žจ์€ ์„œ๋ฅ˜์ ‘์ˆ˜์™€ ์ฐธ๊ฐ€๋น„๋งŒ ์žˆ์œผ๋ฉด ๋๋‹ค. ํŒ€ ๋นŒ๋”ฉ ๋•Œ ํ”„๋กœํ•„์„ ๋ณด๋‹ˆ ๋Œ€๋ถ€๋ถ„์ด 20๋Œ€์ด๋ฉฐ, ์ทจ์ค€์ƒ๊ณผ ์‹ ์ž…๋“ค์ด ๋งŽ์•˜๋‹ค. ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์€ ํŒ€ ๋นŒ๋”ฉ๊ธฐ๊ฐ„๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋ฐœํ‘œํ•˜๋Š” ๋‚ ๊นŒ์ง€ 1/15 ~ 3/15, ๋‘๋‹ฌ๊ฐ„ ์ง„ํ–‰ํ–ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์™€ ํŒ€์› ์šฐ๋ฆฌ ํŒ€์€ ๊ธฐํš1, ๋””์ž์ด๋„ˆ1, ํ”„๋ก ํŠธ2, ๋ฐฑ์—”๋“œ2(๋‚˜ ํฌํ•จ)๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค. ์Šค์œ„ํ”„์—์„œ ํŒ€ ๋นŒ๋”ฉ์„ ์œ„ํ•ด ๊ฐ ํ”„๋กœํ•„์„ ๋…ธ์…˜ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•ด์คฌ๋Š”๋ฐ ๊ฑฐ๊ธฐ์„œ ์ง€๊ธˆ์˜ ํŒ€์›๋“ค์„ ๋งŒ๋‚ฌ๋‹ค. ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด๋Š” ์—ฌ๋Ÿฌ ์˜๊ฒฌ์ด ์žˆ์—ˆ์ง€๋งŒ โ€œSNS์— ์–ด๋–ค ์‚ฌ์ง„์„ ์˜ฌ๋ฆฌ๋Š”๊ฒŒ ์ข‹์„๊นŒ?โ€œ๋ผ๋Š” ์˜๋ฌธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์ง„์„ ํˆฌํ‘œํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” โ€œ๋ฝ€๋˜ํ”ฝ"์ด๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ...

March 31, 2025 21:20 ยท 2 min ยท 357 words ยท nakji

springframework.http.ResponseEntity

๐Ÿ”” ResponseEntity ๊ฐœ์š” ๐Ÿ”” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๊ณผ ๋น„๊ต What? Why? ์Šคํ”„๋ง 3 ๋ฒ„์ „๋ถ€ํ„ฐ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ์Šคํ”„๋ง MVC์—์„œ HTTP ์‘๋‹ต์„ ๋‹ค๋ฃจ๋Š” ์ฃผ์š” ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์ด๋‹ค. HTTP ์‘๋‹ต์˜ ์ „์ฒด ๋‚ด์šฉ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ (HTTP Status Code) : 200 OK, 404 Not Found, 500 Internal Server Error ๋“ฑ ํ—ค๋” (Headers) : ์‘๋‹ต ํ—ค๋”์— ํŠน์ • ๊ฐ’์„ ์ถ”๊ฐ€/์ˆ˜์ • ๋ณธ๋ฌธ (Body) : ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋  ๋ฐ์ดํ„ฐ @GetMapping("/example") public ResponseEntity<String> getExample() { String body = "Hello, World!"; HttpHeaders headers = new HttpHeaders(); headers.add("Custom-Header", "CustomValue"); return new ResponseEntity<>(body, headers, HttpStatus.OK); } @ResponseBody ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ์ด๊ฒƒ๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ—ค๋”๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค. @ResopnseStatus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋”๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ...

January 24, 2025 11:05 ยท 1 min ยท 195 words ยท nakji

4D4cat) ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์™œ ์“ฐ๋Š”๊ฑธ๊นŒ?

๐Ÿ”” ์–ด๋…ธํ…Œ์ด์…˜ ์ข…๋ฅ˜์™€ ์šฉ๋„ RequiredArgsConstructor Lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ํด๋ž˜์Šค ๋‚ด์˜ final ํ•„๋“œ๋‚˜ @NonNull ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํ•„๋“œ๋“ค์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค. ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ์ค€๋‹ค๋Š” ๊ฒƒ์— ์ด์ ์ด ์žˆ๋‹ค. @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; private final EmailService emailService; // Lombok์ด ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. // public UserService(UserRepository userRepository, EmailService emailService) { // this.userRepository = userRepository; // this.emailService = emailService; // } // ์„œ๋น„์Šค ๋กœ์ง... } Autowired์™€ ์ฐจ์ด์  ์‹ค์ œ๋กœ ๊ธฐ๋Šฅ์€ ๋™์ผํ•˜์ง€๋งŒ, ์ฝ”๋“œ๋Ÿ‰์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ...

January 23, 2025 13:33 ยท 3 min ยท 556 words ยท nakji

OAuth2 Deepdive

๐Ÿ”” Oauth2 ์ ์šฉ ์ „ ๐Ÿ”” Oauth2 ์‹ค์Šต ๊ฐœ์š” ์ตœ๊ทผ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์„ค์ •ํ•˜๊ณ  ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ์— ๋งž๊ฒŒ ๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ์ง„ํ–‰์„ ํ–ˆ์œผ๋‚˜โ€ฆ ์•„๋ฌด๋ฆฌ ๋ด๋„ ๊ณผ์ • ํ•˜๋‚˜ ํ•˜๋‚˜๋ฅผ ๋‚ด ์†์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ๋งž๋Š”๊ฑด๊ฐ€? ๋ผ๋Š” ์˜๋ฌธ์„ ์‹œ์ž‘์œผ๋กœ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ดค๊ณ , ๊ทธ๋ ‡๊ฒŒ Oauth 2.0์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ์‹์„ ์ฐพ๊ฒŒ ๋˜์—ˆ๋‹ค. Oauth2 ์ ์šฉ ์ „ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๋– ๋‚˜์„œ ์ง€๊ธˆ ์™€์„œ ๋ณด๋‹ˆ ๋งˆ์น˜ Oauth 1.0์ฒ˜๋Ÿผ ๊ตฌํ˜„์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋‚˜ ๋˜ํ•œ, ๊ฐ ํ”Œ๋กœ์šฐ๋งˆ๋‹ค ํ•˜๋“œ ์ฝ”๋”ฉ์€ ์ค„์ด๊ณ  ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์žฌํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ๋ณด์•ˆ ์š”์†Œ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด์„œ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค. ...

January 18, 2025 11:48 ยท 4 min ยท 768 words ยท nakji

OAuth2

๐Ÿ”” Oauth2? ๊ทธ๋Ÿผ Oauth1๋„? ๐Ÿ”” Oauth2 ๋™์ž‘ ๊ณผ์ • RFC6749(Oauth 2.0) ๋ฌธ์„œ๋ฅผ ํ† ๋Œ€๋กœ ์š”์•ฝํ•˜์—ฌ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ˆ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. What? Why? ์ธ์ฆ(authentication) ์ด ์•„๋‹Œ ์ธ๊ฐ€(authorization)์— ์ดˆ์ ์„ ๋งž์ถ”๋ฉฐ, ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ž์‹ ์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ œํ•œ์  ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์—ญํ•  Resource Owner ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค(Protected Resource)์˜ ์‹ค์ œ ์†Œ์œ ์ž ํ˜น์€ ์ฃผ์ฒด ex) ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •, ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ Resource Server ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ˜ธ์ŠคํŒ…(์ €์žฅ ๋ฐ ๊ด€๋ฆฌ)ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์œ ํšจํ•œ ํ† ํฐ์ด๋ฉด ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์„ ํ—ˆ์šฉ Client ...

January 17, 2025 17:23 ยท 3 min ยท 450 words ยท nakji

HttpClient Deepdive

๐Ÿ”” BodyPublisher, BodyHandler ์—ญํ•  ๐Ÿ”” HttpClient ์‹ค์Šต BodyPublisher? BodyHandler? BodyPublisher์™€ BodyHandlers๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ๋ณธ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ƒํ˜ธ ๋ณด์™„์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค. BodyPublisher๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ , BodyHandlers๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ๋‘ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด, HTTP ํ†ต์‹ ์„ ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. BodyPublisher HTTP ์š”์ฒญ์˜ ๋ณธ๋ฌธ์„ ์ œ๊ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ• ์ง€ ์ •์˜ BodyPublishers.ofString(String): ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ BodyPublishers.ofByteArray(byte[]): ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ BodyPublishers.ofFile(Path): ํŒŒ์ผ ๋ฐ์ดํ„ฐ BodyPublishers.ofInputStream(Supplier<InputStream>): ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ BodyHandler HTTP ์‘๋‹ต์˜ ๋ณธ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์ •์˜ BodyHandlers.ofString(): ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ BodyHandlers.ofByteArray(): ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ BodyHandlers.ofFile(Path): ํŒŒ์ผ ๋ฐ์ดํ„ฐ BodyHandlers.ofInputStream(): InputStream์œผ๋กœ ๋ฐ์ดํ„ฐ ์ œ๊ณต HttpResponse.BodyHandler ํด๋ž˜์Šค๋Š” BodyHandler๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŽธ๋ฆฌํ•œ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋“ค ์ค‘ ๋‹ค์ˆ˜๋Š” ์‘๋‹ต ๋ฐ”์ดํŠธ๊ฐ€ ์™„์ „ํžˆ ์ˆ˜์‹ ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ์ถ•์ ๋˜๋ฉฐ, ๊ทธ ํ›„ ์‘๋‹ต ๋ฐ”์ดํŠธ๋Š” ์ƒ์œ„ ์ˆ˜์ค€์˜ Java ์œ ํ˜•(ofString, ofByteArray ๋“ฑ)์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ...

January 12, 2025 17:37 ยท 2 min ยท 386 words ยท nakji

java.net.http.HttpClient

๐Ÿ”” HttpClient ๊ฐœ์š” ๐Ÿ”” HttpClient ๊ฐœ์„  ๊ณผ์ • ๐Ÿ”” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น„๊ต What? Why? ์ž๋ฐ”์—์„œ HTTP ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๊ณ , ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋ฉฐ, ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ API Java 11์—์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ์ด์ „์˜ HttpURLConnection๋ณด๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•˜๋‹ค. ๋นŒ๋” ํŒจํ„ด ๋„์ž…: HttpRequest.newBuilder() ์—ญํ•  ๋ถ„๋ฆฌ: HttpClient, HttpRequest, HttpResponse ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ง€์›: HttpClient.sendAsync() ์ฃผ์š” ํด๋ž˜์Šค HttpClient: HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ HttpRequest: HTTP ์š”์ฒญ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ(URI, ๋ฉ”์„œ๋“œ, ํ—ค๋” ๋“ฑ) HttpResponse: ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ HTTP ์‘๋‹ต ์ฃผ์š” ๋ฉ”์„œ๋“œ HttpClient.newHttpClient() ๊ธฐ๋ณธ ์„ค์ •์„ ์‚ฌ์šฉํ•œ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ - ์š”์ฒญ(GET), ํ”„๋กœํ† ์ฝœ(HTTP/2), ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(NEVER), SSL(Default) ...

January 10, 2025 16:43 ยท 2 min ยท 272 words ยท nakji