Web

๋ธŒ๋ผ์šฐ์ € ๋™์ž‘ ๋ฐฉ๋ฒ•

"๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•„์„ธ์š”?"

์›น ์„œํ•‘ํ•˜๋‹ค๋ณด๋ฉด ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ url์„ ํ†ตํ•ด ์‚ฌ์ดํŠธ๋ฅผ ๋Œ์•„๋‹ค๋‹Œ๋‹ค. ์ด url์ด ์ž…๋ ฅ๋˜์—ˆ์„ ๋•Œ ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ์ถœ๋ ฅ๋˜๋Š”๊ฑธ๊นŒ?

web์˜ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์ด์ง€๋งŒ ์„ค๋ช…ํ•˜๊ธฐ ๋ฌด์ง€ ์–ด๋ ต๋‹ค.. ๋ Œ๋”๋ง..? ํŒŒ์‹ฑ..?

๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ ์ฐฝ์—http://naver.com์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ๋„ค์ด๋ฒ„ ํŽ˜์ด์ง€๊ฐ€ ํ™”๋ฉด์— ๋ณด์ด๋Š” ์ง€ ์•Œ์•„๋ณด์ž

์˜คํ”ˆ ์†Œ์Šค ๋ธŒ๋ผ์šฐ์ €(ํฌ๋กฌ, ํŒŒ์ด์–ดํญ์Šค, ์‚ฌํŒŒ๋ฆฌ ๋“ฑ)๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ๋กœ ์ •๋ฆฌ

โœจ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์š” ๊ธฐ๋Šฅ


์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ž์›์„ ์„œ๋ฒ„์— ์š”์ฒญ, ๋ธŒ๋ผ์šฐ์ €์— ํ‘œ์‹œ

์ž์›์€ html ๋ฌธ์„œ, pdf, image ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ

์ž์›์˜ ์ฃผ์†Œ๋Š” URI์— ์˜ํ•ด ์ •ํ•ด์ง

๋ธŒ๋ผ์šฐ์ €๋Š” html๊ณผ css ๋ช…์„ธ์— ๋”ฐ๋ผ html ํŒŒ์ผ์„ ํ•ด์„ํ•ด์„œ ํ‘œ์‹œํ•จ

์ด '๋ช…์„ธ'๋Š” ์›น ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ธ W3C(World wide web Consortium)์—์„œ ์ •ํ•ด์ง

์˜ˆ์ „ ๋ธŒ๋ผ์šฐ์ €๋“ค์€ ์ผ๋ถ€๋งŒ ๋ช…์„ธ์— ๋”ฐ๋ผ ๊ตฌํ˜„ํ•˜๊ณ  ๋…์ž์  ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์žฅํ–ˆ์Œ

(๊ฒฐ๊ตญ ์‹ฌ๊ฐํ•œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ... ๊ทธ๋ž˜์„œ ์š”์ฆ˜์€ ๋Œ€๋ถ€๋ถ„ ๋ชจ๋‘ ํ‘œ์ค€ ๋ช…์„ธ๋ฅผ ๋”ฐ๋ฆ„)

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ณดํ†ต ๋น„์Šท๋น„์Šทํ•œ ์š”์†Œ๋“ค์ด ์กด์žฌ

์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ, ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ ์„œ๋น„์Šค๋“ค๋กœ ์„œ๋กœ ๋ชจ๋ฐฉํ•˜๋ฉฐ ๊ฐ–์ถฐ์ง€๊ฒŒ ๋œ ๊ฒƒ

  • URI ์ž…๋ ฅํ•˜๋Š” ์ฃผ์†Œ ํ‘œ์‹œ ์ค„

  • ์ด์ „ ๋ฒ„ํŠผ, ๋‹ค์Œ ๋ฒ„ํŠผ

  • ๋ถ๋งˆํฌ(์ฆ๊ฒจ์ฐพ๊ธฐ)

  • ์ƒˆ๋กœ ๊ณ ์นจ ๋ฒ„ํŠผ

  • ํ™ˆ ๋ฒ„ํŠผ

โœจ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ๊ตฌ์กฐ


โœจ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค

์ฃผ์†Œ ํ‘œ์‹œ์ค„, ์ด์ „/๋‹ค์Œ ๋ฒ„ํŠผ, ๋ถ๋งˆํฌ ๋“ฑ ์‚ฌ์šฉ์ž๊ฐ€ ํ™œ์šฉํ•˜๋Š” ์„œ๋น„์Šค๋“ค (์š”์ฒญํ•œ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ฐฝ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„)

โœจ ๋ธŒ๋ผ์šฐ์ € ์—”์ง„

์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ Œ๋”๋ง ์—”์ง„ ์‚ฌ์ด์˜ ๋™์ž‘ ์ œ์–ด

โœจ ๋ Œ๋”๋ง ์—”์ง„

์š”์ฒญํ•œ ์ฝ˜ํ…์ธ  ํ‘œ์‹œ (html ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด? โ†’ html, css ํŒŒ์‹ฑํ•ด์„œ ํ™”๋ฉด์— ํ‘œ์‹œ)

โœจ ํ†ต์‹ 

http ์š”์ฒญ๊ณผ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์— ์‚ฌ์šฉ (ํ”Œ๋žซํผ์˜ ๋…๋ฆฝ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Œ)

โœจ UI ๋ฐฑ์—”๋“œ

ํ”Œ๋žซํผ์—์„œ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ์ผ๋ฐ˜์  ์ธํ„ฐํŽ˜์ด์Šค. ์ฝค๋ณด ๋ฐ•์Šค ์ฐฝ๊ฐ™์€ ๊ธฐ๋ณธ์  ์žฅ์น˜๋ฅผ ๊ทธ๋ฆผ

โœจ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ด์„๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰

โœจ ์ž๋ฃŒ ์ €์žฅ์†Œ

์ฟ ํ‚ค ๋“ฑ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ž์›์„ ํ•˜๋“œ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ๊ณ„์ธต

โœจ ๋ Œ๋”๋ง์ด๋ž€?

์›น ๋ถ„์•ผ๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋ฉด ๋ Œ๋”๋ง์ด๋ผ๋Š” ๋ง์„ ๋งŽ์ด ๋ณธ๋‹ค. ๋™์ž‘ ๊ณผ์ •์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž

๋ Œ๋”๋ง ์—”์ง„์€ ์š”์ฒญ ๋ฐ›์€ ๋‚ด์šฉ์„ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์ค€๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ html, xml ๋ฌธ์„œ์™€ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Œ

์ถ”๊ฐ€๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ๊ธฐ๋Šฅ์œผ๋กœ pdf ๋“ฑ ๋‹ค๋ฅธ ์œ ํ˜•๋„ ํ‘œ์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•จ

(์ถ”๊ฐ€๋กœ ํ™•์žฅ์ด ํ•„์š”ํ•œ ์œ ํ˜•์€ ๋ฐ”๋กœ ๋œจ์ง€ ์•Š๊ณ  ํŒ์—…์œผ๋กœ ํ™•์žฅ ์—ฌ๋ถ€๋ฅผ ๋ฌป๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž„)

โœจ ๋ Œ๋”๋ง ์—”์ง„ ์ข…๋ฅ˜

ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ : ์›นํ‚ท(Webkit) ์—”์ง„ ์‚ฌ์šฉ

ํŒŒ์ด์–ดํญ์Šค : ๊ฒŒ์ฝ”(Gecko) ์—”์ง„ ์‚ฌ์šฉ

์›นํ‚ท(Webkit) : ์ตœ์ดˆ ๋ฆฌ๋ˆ…์Šค ํ”Œ๋žซํผ์— ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ์—”์ง„ (์• ํ”Œ์ด ๋งฅ๊ณผ ์œˆ๋„์šฐ์—์„œ ์‚ฌํŒŒ๋ฆฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ •์„ ๋”ํ–ˆ์Œ)

โœจ ๋ Œ๋”๋ง ๋™์ž‘ ๊ณผ์ •

`๋จผ์ € html ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฝ˜ํ…์ธ  ํŠธ๋ฆฌ ๋‚ด๋ถ€์—์„œ ํƒœ๊ทธ๋ฅผ ๋ชจ๋‘ DOM ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ์™ธ๋ถ€ css ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ํฌํ•จ๋œ ์Šคํƒ€์ผ ์š”์†Œ๋ฅผ ํŒŒ์‹ฑํ•œ๋‹ค.

์ด ์Šคํƒ€์ผ ์ •๋ณด์™€ html ํ‘œ์‹œ ๊ทœ์น™์€ ๋ Œ๋” ํŠธ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋˜ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š”๋ฐ, ์ƒ์„ฑ ๊ณผ์ •์ด ๋๋‚ฌ์„ ๋•Œ ๋ฐฐ์น˜๊ฐ€ ์ง„ํ–‰๋˜๋ฉด์„œ ๋…ธ๋“œ๊ฐ€ ํ™”๋ฉด์˜ ์ •ํ™•ํ•œ ์œ„์น˜์— ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ดํ›„์— UI ๋ฐฑ์—”๋“œ์—์„œ ๋ Œ๋” ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋กœ์ง€์œผ๋ฉฐ ํ˜•์ƒ์„ ๋งŒ๋“œ๋Š” ๊ทธ๋ฆฌ๊ธฐ ๊ณผ์ •์ด ์ง„ํ–‰๋œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์ด ์ ์ง„์ ์œผ๋กœ ์ง„ํ–‰๋˜๋ฉฐ, ๋ Œ๋”๋ง ์—”์ง„์€ ์ข€๋” ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  html์„ ํŒŒ์‹ฑํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐฐ์น˜์™€ ๊ทธ๋ฆฌ๊ธฐ ๊ณผ์ •์„ ์‹œ์ž‘ํ•œ๋‹ค. (๋งˆ์น˜ ๋น„๋™๊ธฐ์ฒ˜๋Ÿผ..?)

์ „์†ก์„ ๋ฐ›๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์‹œ์— ๋ฐ›์€ ๋‚ด์šฉ์„ ๋จผ์ € ํ™”๋ฉด์— ๋ณด์—ฌ์ค€๋‹ค (์šฐ๋ฆฌ๊ฐ€ ์›นํŽ˜์ด์ง€์— ์ ‘์†ํ•  ๋•Œ ํ•œ๊บผ๋ฒˆ์— ๋œจ์ง€ ์•Š๊ณ  ์ ์  ํ™”๋ฉด์— ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ์ด ๋•Œ๋ฌธ!!!)`

DOM์ด๋ž€?

Document Object Model(๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ)

์›นํŽ˜์ด์ง€ ์†Œ์Šค๋ฅผ ๊นŒ๋ณด๋ฉด <html>, <body>์™€ ๊ฐ™์€ ํƒœ๊ทธ๋“ค์ด ์กด์žฌํ•œ๋‹ค. ์ด๋ฅผ Javascript๊ฐ€ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๋ฉด ๋ฌธ์„œ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

๋ชจ๋ธ์€ ๋ง ๊ทธ๋Œ€๋กœ, ๋ชจ๋“ˆํ™”๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๊ฑฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ์ธ์‹ํ•œ๋‹ค๋ผ๊ณ  ํ•ด์„ํ•˜๋ฉด ๋œ๋‹ค.

์ฆ‰, DOM์€ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ html ํŽ˜์ด์ง€๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. (ํŠธ๋ฆฌ๊ตฌ์กฐ)

โœจ ์›นํ‚ท ๋™์ž‘ ๊ตฌ์กฐ

์–ดํƒœ์น˜๋จผํŠธ : ์›นํ‚ท์ด ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด DOM ๋…ธ๋“œ์™€ ์Šคํƒ€์ผ ์ •๋ณด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •

์ด์ œ ์กฐ๊ธˆ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ง„ํ–‰ ๋ฐฉ์‹์ด ์ดํ•ด๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค..ใ…Žใ…Ž

โœจ ํŒŒ์‹ฑ๊ณผ DOM ํŠธ๋ฆฌ ๊ตฌ์ถ•


ํŒŒ์‹ฑ์ด๋ผ๋Š” ๋ง๋„ ๋งŽ์ด ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค.

ํŒŒ์‹ฑ์€ ๋ Œ๋”๋ง ์—”์ง„์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ณผ์ •์ด๋‹ค.

โœจ ํŒŒ์‹ฑ(parsing)

๋ฌธ์„œ ํŒŒ์‹ฑ์€, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ

๋ฌธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ , ์–ดํœ˜ ๋ถ„์„๊ณผ ๊ตฌ๋ฌธ ๋ถ„์„ ๊ณผ์ •์„ ๊ฑฐ์ณ ํŒŒ์‹ฑ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค.

์กฐ๊ธˆ ๋ณต์žกํ•œ๋ฐ, ์–ดํœ˜ ๋ถ„์„๊ธฐ๋ฅผ ํ†ตํ•ด ์–ธ์–ด์˜ ๊ตฌ๋ฌธ ๊ทœ์น™์— ๋”ฐ๋ผ ๋ฌธ์„œ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๊ตฌ๋ฌธ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š” ์ง€ ๋น„๊ตํ•˜๊ณ , ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ๋งŒ ํŒŒ์‹ฑ ํŠธ๋ฆฌ์— ์ถ”๊ฐ€์‹œํ‚จ๋‹ค. (๋๊นŒ์ง€ ๊ทœ์น™์ด ๋งž์ง€ ์•Š๋Š” ๋ถ€๋ถ„์€ ๋ฌธ์„œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๊ณ  ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ)

ํŒŒ์„œ ํŠธ๋ฆฌ๊ฐ€ ๋‚˜์™”๋‹ค๊ณ  ํ•ด์„œ ๋์ด ์•„๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ์˜ ๊ณผ์ •์ผ ๋ฟ, ๋‹ค์‹œ ๊ธฐ๊ณ„์ฝ”๋“œ ๋ฌธ์„œ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ๊ณผ์ •๊นŒ์ง€ ์™„๋ฃŒ๋˜๋ฉด ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

๋ณดํ†ต ์ด๋Ÿฐ ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ๊ทœ์น™ ๋ถ€์—ฌ ๋“ฑ ๋ณต์žกํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๊ธฐ ํž˜๋“œ๋ฏ€๋กœ, ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŽ์ด ํ™œ์šฉํ•œ๋‹ค.

์›นํ‚ท์€ ํ”Œ๋ ‰์Šค(flex)๋‚˜ ๋ฐ”์ด์Šจ(bison)์„ ์ด์šฉํ•˜์—ฌ ์œ ์šฉํ•˜๊ฒŒ ํŒŒ์‹ฑ์ด ๊ฐ€๋Šฅ

์šฐ๋ฆฌ๊ฐ€ head ํƒœ๊ทธ๋ฅผ ์‹ค์ˆ˜๋กœ ๋น ๋œจ๋ ค๋„, ํŒŒ์„œ๊ฐ€ ๋Œ๋ฉด์„œ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ด์คŒ ( head ์—˜๋ฆฌ๋จผํŠธ ๊ฐ์ฒด๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค)

๊ฒฐ๊ตญ ์ด ํŒŒ์‹ฑ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” DOM ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค!

โœจ ์š”์•ฝ

  • ์ฃผ์†Œ์ฐฝ์— url์„ ์ž…๋ ฅํ•˜๊ณ  Enter๋ฅผ ๋ˆ„๋ฅด๋ฉด, ์„œ๋ฒ„์— ์š”์ฒญ์ด ์ „์†ก๋จ

  • ํ•ด๋‹น ํŽ˜์ด์ง€์— ์กด์žฌํ•˜๋Š” ์—ฌ๋Ÿฌ ์ž์›๋“ค(text, image ๋“ฑ๋“ฑ)์ด ๋ณด๋‚ด์ง

  • ์ด์ œ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์ž์›์ด ๋‹ด๊ธด html๊ณผ ์Šคํƒ€์ผ์ด ๋‹ด๊ธด css๋ฅผ W3C ๋ช…์„ธ์— ๋”ฐ๋ผ ํ•ด์„ํ•  ๊ฒƒ์ž„

  • ์ด ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด '๋ Œ๋”๋ง ์—”์ง„'

  • ๋ Œ๋”๋ง ์—”์ง„์€ ์šฐ์„  html ํŒŒ์‹ฑ ๊ณผ์ •์„ ์‹œ์ž‘ํ•จ. html ํŒŒ์„œ๊ฐ€ ๋ฌธ์„œ์— ์กด์žฌํ•˜๋Š” ์–ดํœ˜์™€ ๊ตฌ๋ฌธ์„ ๋ถ„์„ํ•˜๋ฉด์„œ DOM ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•

  • ๋‹ค์Œ์—” css ํŒŒ์‹ฑ ๊ณผ์ • ์‹œ์ž‘. css ํŒŒ์„œ๊ฐ€ ๋ชจ๋“  css ์ •๋ณด๋ฅผ ์Šคํƒ€์ผ ๊ตฌ์กฐ์ฒด๋กœ ์ƒ์„ฑ

  • ์ด 2๊ฐ€์ง€๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ฌ. ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฌธ์„œ๊ฐ€ ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ ์ƒํƒœ

  • ํ™”๋ฉด์— ๋ฐฐ์น˜๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , UI ๋ฐฑ์—”๋“œ๊ฐ€ ๋…ธ๋“œ๋ฅผ ๋Œ๋ฉฐ ํ˜•์ƒ์„ ๊ทธ๋ฆผ

  • ์ด๋•Œ ๋น ๋ฅธ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด '๋ฐฐ์น˜์™€ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •'์€ ํŽ˜์ด์ง€ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋ฐ›๊ณ  ํ•œ๊บผ๋ฒˆ์— ์ง„ํ–‰๋˜์ง€ ์•Š์Œ. ์ž์›์„ ์ „์†ก๋ฐ›์œผ๋ฉด, ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์‹œ์— ์ผ๋ถ€๋ถ„ ๋จผ์ € ์ง„ํ–‰ํ•˜๊ณ  ํ™”๋ฉด์— ํ‘œ์‹œํ•จ

์ฟ ํ‚ค vs ์„ธ์…˜

โœจ ์ €์žฅ ์œ„์น˜

  • ์ฟ ํ‚ค : ํด๋ผ์ด์–ธํŠธ์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์ •ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ or ํ•˜๋“œ๋””์Šคํฌ

  • ์„ธ์…˜ : ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ

โœจ ๋งŒ๋ฃŒ ์‹œ์ 

  • ์ฟ ํ‚ค : ์ €์žฅํ•  ๋•Œ expires ์†์„ฑ์„ ์ •์˜ํ•ด ๋ฌดํšจํ™”์‹œํ‚ค๋ฉด ์‚ญ์ œ๋  ๋‚ ์งœ ์ •ํ•  ์ˆ˜ ์žˆ์Œ

  • ์„ธ์…˜ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜, ์„ค์ • ์‹œ๊ฐ„๋™์•ˆ ๋ฐ˜์‘์ด ์—†์œผ๋ฉด ๋ฌดํšจํ™” ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํ•œ ์‹œ์  ์•Œ ์ˆ˜ ์—†์Œ

โœจ ๋ฆฌ์†Œ์Šค

  • ์ฟ ํ‚ค : ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ž์› ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

  • ์„ธ์…˜ : ์„ธ์…˜์€ ์„œ๋ฒ„์— ์ €์žฅ๋˜๊ณ , ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋กœ๋”ฉ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐจ์ง€ํ•จ

โœจ ์šฉ๋Ÿ‰ ์ œํ•œ

  • ์ฟ ํ‚ค : ํด๋ผ์ด์–ธํŠธ๋„ ๋ชจ๋ฅด๊ฒŒ ์ ‘์†๋˜๋Š” ์‚ฌ์ดํŠธ์— ์˜ํ•˜์—ฌ ์„ค์ •๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฑธ ๋ง‰๊ณ ์ž ํ•œ ๋„๋ฉ”์ธ๋‹น 20๊ฐœ, ํ•˜๋‚˜์˜ ์ฟ ํ‚ค ๋‹น 4KB๋กœ ์ œํ•œํ•ด ๋‘ 

  • ์„ธ์…˜ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•˜๋ฉด ์„œ๋ฒ„์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๊ฐœ์ˆ˜๋‚˜ ์šฉ๋Ÿ‰ ์ œํ•œ ์—†์Œ

HTTP status code

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ HTTP API๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ž„

์ด๋•Œ, ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ API ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ผญ ์•Œ์•„์•ผ ํ•  ๊ฒƒ์ด HTTP status code๋‹ค

  • 10x : ์ •๋ณด ํ™•์ธ

  • 20x : ํ†ต์‹  ์„ฑ๊ณต

  • 30x : ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

  • 40x : ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜

  • 50x : ์„œ๋ฒ„ ์˜ค๋ฅ˜

200๋ฒˆ๋Œ€ : ํ†ต์‹  ์„ฑ๊ณต

300๋ฒˆ๋Œ€ : ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

400๋ฒˆ๋Œ€ : ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜

500๋ฒˆ๋Œ€ : ์„œ๋ฒ„ ์˜ค๋ฅ˜

์›น ์„œ๋ฒ„์™€ WAS์˜ ์ฐจ์ด์ 

์›น ์„œ๋ฒ„์™€ was์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ? ์„œ๋ฒ„ ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ๊ธฐ์ดˆ์ ์ธ ๊ฐœ๋…์ด๋‹ค.

๋จผ์ €, ์ •์  ํŽ˜์ด์ง€์™€ ๋™์  ํŽ˜์ด์ง€๋ฅผ ์•Œ์•„๋ณด์ž

โœจ Static Pages

๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํŽ˜์ด์ง€

์›น ์„œ๋ฒ„๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ ์ด๋ฆ„์„ ๋ฐ›๊ณ , ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” file contents๋ฅผ ๋ฐ˜ํ™˜ํ•จ

ํ•ญ์ƒ ๋™์ผํ•œ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•จ

image, html, css, javascript ํŒŒ์ผ๊ณผ ๊ฐ™์ด ์ปดํ“จํ„ฐ์— ์ €์žฅ๋œ ํŒŒ์ผ๋“ค

โœจ Dynamic Pages

์ธ์ž์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” ํŽ˜์ด์ง€

์ธ์ž์˜ ๋‚ด์šฉ์— ๋งž๊ฒŒ ๋™์ ์ธ contents๋ฅผ ๋ฐ˜ํ™˜ํ•จ

์›น ์„œ๋ฒ„์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ๋ฌผ์ž„ (Servlet : was ์œ„์—์„œ ๋Œ์•„๊ฐ€๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ)

๊ฐœ๋ฐœ์ž๋Š” Servlet์— doGet() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•จ

โœจ ์›น ์„œ๋ฒ„์™€ WAS์˜ ์ฐจ์ด

โœจ ์›น ์„œ๋ฒ„

๊ฐœ๋…์— ์žˆ์–ด์„œ ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

ํ•˜๋“œ์›จ์–ด : Web ์„œ๋ฒ„๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ

์†Œํ”„ํŠธ์›จ์–ด : ์›น ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ HTTP ์š”์ฒญ์„ ๋ฐ›๊ณ , ์ •์ ์ธ ์ปจํ…์ธ (html, css ๋“ฑ)๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ

โœจ ์›น ์„œ๋ฒ„ ๊ธฐ๋Šฅ

Http ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์„œ๋น„์Šคํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹น

์š”์ฒญ์— ๋งž๊ฒŒ ๋‘๊ฐ€์ง€ ๊ธฐ๋Šฅ ์ค‘ ์„ ํƒํ•ด์„œ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

  • ์ •์  ์ปจํ…์ธ  ์ œ๊ณต

    WAS๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ž์› ์ œ๊ณต

  • ๋™์  ์ปจํ…์ธ  ์ œ๊ณต์„ ์œ„ํ•œ ์š”์ฒญ ์ „๋‹ฌ

    ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ WAS์— ๋ณด๋‚ด๊ณ , WAS์—์„œ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ

์›น ์„œ๋ฒ„ ์ข…๋ฅ˜ : Apache, Nginx, IIS ๋“ฑ

โœจ WAS

Web Application Server์˜ ์•ฝ์ž

DB ์กฐํšŒ ๋ฐ ๋‹ค์–‘ํ•œ ๋กœ์ง ์ฒ˜๋ฆฌ ์š”๊ตฌ์‹œ ๋™์ ์ธ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„

HTTP๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” ๋ฏธ๋“ค์›จ์–ด๋‹ค.

WAS๋Š” ์›น ์ปจํ…Œ์ด๋„ˆ ํ˜น์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ

(์ปจํ…Œ์ด๋„ˆ๋ž€ JSP, Servlet์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด. ์ฆ‰, WAS๋Š” JSP, Servlet ๊ตฌ๋™ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด์คŒ)

โœจ ์—ญํ• 

WAS = ์›น ์„œ๋ฒ„ + ์›น ์ปจํ…Œ์ด๋„ˆ

์›น ์„œ๋ฒ„์˜ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• 

๋ณด์•ˆ, ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ, ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๋“ฑ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋จ ( ์ฃผ๋กœ DB ์„œ๋ฒ„์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ )

โœจ WAS ์ฃผ์š” ๊ธฐ๋Šฅ

1.ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ™˜๊ฒฝ ๋ฐ DB ์ ‘์† ๊ธฐ๋Šฅ ์ œ๊ณต

2.์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

3.์—…๋ฌด ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰

WAS ์ข…๋ฅ˜ : Tomcat, JBoss ๋“ฑ

๊ทธ๋Ÿผ, ๋‘˜์„ ๊ตฌ๋ถ„ํ•˜๋Š” ์ด์œ ๋Š”?

โœจ ์›น ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์›น ์„œ๋ฒ„์—์„œ๋Š” ์ •์  ์ปจํ…์ธ ๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ธฐ๋Šฅ ๋ถ„๋ฐฐ๋ฅผ ํ•ด์„œ ์„œ๋ฒ„ ๋ถ€๋‹ด์„ ์ค„์ด๋Š” ๊ฒƒ

`ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ์ง€ ํŒŒ์ผ(์ •์  ์ปจํ…์ธ )๋ฅผ ๋ณด๋‚ผ ๋•Œ..

์›น ๋ฌธ์„œ(html ๋ฌธ์„œ)๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์งˆ ๋•Œ ์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ •์  ํŒŒ์ผ์€ ํ•จ๊ป˜ ๋ณด๋‚ด์ง€์ง€ ์•Š์Œ ๋จผ์ € html ๋ฌธ์„œ๋ฅผ ๋ฐ›๊ณ , ์ด์— ํ•„์š”ํ•œ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“ค์„ ๋‹ค์‹œ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•ด์„œ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ

๋”ฐ๋ผ์„œ ์›น ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ ์ •์ ์ธ ํŒŒ์ผ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊นŒ์ง€ ๊ฐ€์ง€ ์•Š๊ณ  ์•ž๋‹จ์— ๋น ๋ฅด๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ!`

โœจ WAS๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

WAS๋ฅผ ํ†ตํ•ด ์š”์ฒญ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ DB์—์„œ ๊ฐ€์ ธ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋งž๊ฒŒ ๊ทธ๋•Œ๋งˆ๋‹ค ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค๊ณ  ์ œ๊ณตํ•˜๋ฉด์„œ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

`๋™์ ์ธ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ• ๋•Œ..

์›น ์„œ๋ฒ„๋งŒ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ชจ๋‘ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“๊ณ  ์„œ๋น„์Šคํ•˜๊ธฐ์—๋Š” ์ž์›์ด ์ ˆ๋Œ€์ ์œผ๋กœ ๋ถ€์กฑํ•จ

๋”ฐ๋ผ์„œ WAS๋ฅผ ํ†ตํ•ด ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค DB์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด ์ œ๊ณต!`

โœจ ๊ทธ๋Ÿฌ๋ฉด WAS๋กœ ์›น ์„œ๋ฒ„ ์—ญํ• ๊นŒ์ง€ ๋‹ค ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?

`WAS๋Š” DB ์กฐํšŒ, ๋‹ค์–‘ํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•ด์•ผ ํ•จ. ๋”ฐ๋ผ์„œ ๋‹จ์ˆœํ•œ ์ •์  ์ปจํ…์ธ ๋Š” ์›น ์„œ๋ฒ„์—๊ฒŒ ๋งก๊ธฐ๋ฉฐ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌ์‹œ์ผœ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ

๋งŒ์•ฝ WAS๊ฐ€ ์ •์  ์ปจํ…์ธ  ์š”์ฒญ๊นŒ์ง€ ์ฒ˜๋ฆฌํ•˜๋ฉด, ๋ถ€ํ•˜๊ฐ€ ์ปค์ง€๊ณ  ๋™์  ์ปจํ…์ธ  ์ฒ˜๋ฆฌ๊ฐ€ ์ง€์—ฐ๋˜๋ฉด์„œ ์ˆ˜ํ–‰ ์†๋„๊ฐ€ ๋А๋ ค์ง โ†’ ํŽ˜์ด์ง€ ๋…ธ์ถœ ์‹œ๊ฐ„ ๋Š˜์–ด๋‚˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ`

๋˜ํ•œ, ์—ฌ๋Ÿฌ ๋Œ€์˜ WAS๋ฅผ ์—ฐ๊ฒฐ์ง€์–ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์›น ์„œ๋ฒ„๋ฅผ ์•ž ๋‹จ์— ๋‘๊ณ , WAS์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ด์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์•„๋‘” ๋’ค ์žฌ์‹œ์ž‘ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ (์‚ฌ์šฉ์ž๋Š” ์˜ค๋ฅ˜๋ฅผ ๋А๋ผ์ง€ ๋ชปํ•˜๊ณ  ์ด์šฉ ๊ฐ€๋Šฅ)

์ž์› ์ด์šฉ์˜ ํšจ์œจ์„ฑ ๋ฐ ์žฅ์•  ๊ทน๋ณต, ๋ฐฐํฌ ๋ฐ ์œ ์ง€ ๋ณด์ˆ˜์˜ ํŽธ์˜์„ฑ ๋•Œ๋ฌธ์— ์›น ์„œ๋ฒ„์™€ WAS๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โœจ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•

์›น ์„œ๋ฒ„๋ฅผ WAS ์•ž์— ๋‘๊ณ , ํ•„์š”ํ•œ WAS๋“ค์„ ์›น ์„œ๋ฒ„์— ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ์„ค์ •ํ•˜๋ฉด ํšจ์œจ์ ์ธ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ

ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋จผ์ € ์›น ์„œ๋ฒ„๊ฐ€ ๋ฐ›์€ ๋‹ค์Œ, WAS์—๊ฒŒ ๋ณด๋‚ด ๊ด€๋ จ๋œ Servlet์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆผ

WAS๋Š” web.xml์„ ์ฐธ์กฐํ•ด ํ•ด๋‹น Servlet์— ๋Œ€ํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ (์Šค๋ ˆ๋“œ ํ’€ ์ด์šฉ)

์ด๋•Œ HttpServletRequest์™€ HttpServletResponse ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด Servlet์—๊ฒŒ ์ „๋‹ฌ

์Šค๋ ˆ๋“œ๋Š” Servlet์˜ service() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ

service() ๋ฉ”์†Œ๋“œ๋Š” ์š”์ฒญ์— ๋งž๊ฒŒ doGet()์ด๋‚˜ doPost() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ

doGet()์ด๋‚˜ doPost() ๋ฉ”์†Œ๋“œ๋Š” ์ธ์ž์— ๋งž๊ฒŒ ์ƒ์„ฑ๋œ ์ ์ ˆํ•œ ๋™์  ํŽ˜์ด์ง€๋ฅผ Response ๊ฐ์ฒด์— ๋‹ด์•„ WAS์— ์ „๋‹ฌ

WAS๋Š” Response ๊ฐ์ฒด๋ฅผ HttpResponse ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ” ์›น ์„œ๋ฒ„๋กœ ์ „๋‹ฌ

์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ ์ข…๋ฃŒํ•˜๊ณ , HttpServletRequest์™€ HttpServletResponse ๊ฐ์ฒด ์ œ๊ฑฐ

OAuth

Open Authentification

์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๋“ค์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ ์ƒ์˜ ์ž์‹ ๋“ค์˜ ์ •๋ณด์— ๋Œ€ํ•ด ์›น์‚ฌ์ดํŠธ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜์žˆ๋Š” ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ๋ฐฉ๋ฒ•

์ด๋Ÿฌํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์€ ๊ตฌ๊ธ€, ํŽ˜์ด์Šค๋ถ, ํŠธ์œ„ํ„ฐ ๋“ฑ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํƒ€์‚ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์›น์‚ฌ์ดํŠธ์˜ ๊ณ„์ •์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์ค€๋‹ค.

โœจ ์‚ฌ์šฉ ์šฉ์–ด

  • ์‚ฌ์šฉ์ž : ๊ณ„์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐœ์ธ

  • ์†Œ๋น„์ž : OAuth๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋น„์Šค ์ œ๊ณต์ž์—๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ์›น์‚ฌ์ดํŠธ or ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

  • ์„œ๋น„์Šค ์ œ๊ณต์ž : OAuth๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ์„ ์ง€์›ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

  • ์†Œ๋น„์ž ๋น„๋ฐ€๋ฒˆํ˜ธ : ์„œ๋น„์Šค ์ œ๊ณต์ž์—์„œ ์†Œ๋น„์ž๊ฐ€ ์ž์‹ ์ž„์„ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค

  • ์š”์ฒญ ํ† ํฐ : ์†Œ๋น„์ž๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ‘๊ทผ๊ถŒํ•œ์„ ์ธ์ฆ๋ฐ›๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ์Œ

  • ์ ‘๊ทผ ํ† ํฐ : ์ธ์ฆ ํ›„์— ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ์•„๋‹Œ ์†Œ๋น„์ž๋ฅผ ํ†ตํ•ด ๋ณดํ˜ธ ์ž์›์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค ๊ฐ’

ํ† ํฐ ์ข…๋ฅ˜๋กœ๋Š” Access Token๊ณผ Refresh Token์ด ์žˆ๋‹ค.

Access Token์€ ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ์žˆ๊ณ  ๋๋‚˜๋ฉด ๋‹ค์‹œ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค. Refresh Token์€ ๋งŒ๋ฃŒ๋˜๋ฉด ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

โœจ ์ธ์ฆ ๊ณผ์ •

์†Œ๋น„์ž <-> ์„œ๋น„์Šค ์ œ๊ณต์ž

  1. ์†Œ๋น„์ž๊ฐ€ ์„œ๋น„์Šค ์ œ๊ณต์ž์—๊ฒŒ ์š”์ฒญํ† ํฐ์„ ์š”์ฒญํ•œ๋‹ค.

  2. ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ์†Œ๋น„์ž์—๊ฒŒ ์š”์ฒญํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.

  3. ์†Œ๋น„์ž๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์„œ๋น„์Šค์ œ๊ณต์ž๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์ด ์ˆ˜ํ–‰๋œ๋‹ค.

  4. ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์†Œ๋น„์ž๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

  5. ์†Œ๋น„์ž๊ฐ€ ์ ‘๊ทผํ† ํฐ์„ ์š”์ฒญํ•œ๋‹ค.

  6. ์„œ๋น„์Šค์ œ๊ณต์ž๊ฐ€ ์ ‘๊ทผํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.

  7. ๋ฐœ๊ธ‰๋œ ์ ‘๊ทผํ† ํฐ์„ ์ด์šฉํ•ด์„œ ์†Œ๋น„์ž์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด์— ์ ‘๊ทผํ•œ๋‹ค.

JWT

JSON Web Tokens are an open, industry standard [RFC 7519] method for representing claims securely between two parties. ์ถœ์ฒ˜ : <https://jwt.io>

JWT๋Š” ์›นํ‘œ์ค€(RFC 7519)์œผ๋กœ์„œ ๋‘ ๊ฐœ์ฒด์—์„œ JSON ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋ณ๊ณ  ์ž๊ฐ€์ˆ˜์šฉ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ •๋ณด๋ฅผ ์•ˆ์ „์„ฑ ์žˆ๊ฒŒ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.

โœจ ๊ตฌ์„ฑ์š”์†Œ

JWT๋Š” . ์„ ๊ตฌ๋ถ„์ž๋กœ 3๊ฐ€์ง€์˜ ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

aaaa.bbbbb.ccccc ์˜ ๊ตฌ์กฐ๋กœ ์•ž๋ถ€ํ„ฐ ํ—ค๋”(header), ๋‚ด์šฉ(payload), ์„œ๋ช…(signature)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

1. **ํ—ค๋” (Header)**

ํ—ค๋”๋Š” typ์™€ alg ๋‘๊ฐ€์ง€์˜ ์ •๋ณด๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. typ๋Š” ํ† ํฐ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. JWT์ด๊ธฐ์— "JWT"๋ผ๋Š” ๊ฐ’์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. alg : ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ HMAC, SHA256, RSA๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ํ† ํฐ์„ ๊ฒ€์ฆ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” signature๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

{ "typ" : "JWT", "alg" : "HS256" }

2. **์ •๋ณด(payload)**

Payload ๋ถ€๋ถ„์—๋Š” ํ† ํฐ์„ ๋‹ด์„ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ณด์˜ ํ•œ ์กฐ๊ฐ์„ ํด๋ ˆ์ž„(claim)์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ์ด๋Š” name / value์˜ ํ•œ ์Œ์œผ๋กœ ์ด๋ค„์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ ˆ์ž„๋“ค์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋งŽ์•„์งˆ๊ฒฝ์šฐ ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ ˆ์ž„์˜ ์ข…๋ฅ˜๋Š” ํฌ๊ฒŒ ์„ธ๋ถ„๋ฅ˜๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค.

  1. ๋“ฑ๋ก๋œ(registered) ํด๋ ˆ์ž„ ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„๋“ค์€ ์„œ๋น„์Šค์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด ์•„๋‹Œ, ํ† ํฐ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ๋‹ด๊ธฐ์œ„ํ•˜์—ฌ ์ด๋ฆ„์ด ์ด๋ฏธ ์ •ํ•ด์ง„ ํด๋ ˆ์ž„๋“ค์ž…๋‹ˆ๋‹ค. ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„์˜ ์‚ฌ์šฉ์€ ๋ชจ๋‘ ์„ ํƒ์ (optional)์ด๋ฉฐ, ์ด์— ํฌํ•จ๋œ ํฌ๋ ˆ์ž„ ์ด๋ฆ„๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • iss : ํ† ํฐ ๋ฐœ๊ธ‰์ž (issuer)

  • sub : ํ† ํฐ ์ œ๋ชฉ (subject)

  • aud : ํ† ํฐ ๋Œ€์ƒ์ž (audience)

  • exp : ํ† ํฐ์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„(expiration), ์‹œ๊ฐ„์€ NumericDate ํ˜•์‹์œผ๋กœ ๋˜์–ด์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์–ธ์ œ๋‚˜ ํ˜„์žฌ ์‹œ๊ฐ„๋ณด๋‹ค ์ดํ›„๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • nbf : Not before์„ ์˜๋ฏธํ•˜๋ฉฐ, ํ† ํฐ์˜ ํ™œ์„ฑ ๋‚ ์งœ์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋„ NumericDateํ˜•์‹์œผ๋กœ ๋‚ ์งœ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ์ด ๋‚ ์งœ๊ฐ€ ์ง€์ •ํ•˜๋ฉฐ, ์ด ๋‚ ์งœ๊ฐ€ ์ง€๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํ† ํฐ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • iat : ํ† ํฐ์ด ๋ฐœ๊ธ‰๋œ ์‹œ๊ฐ„(issued at), ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์˜ age๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋˜์—ˆ๋Š”์ง€ ํŒ๋‹จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • jti : JWT์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋กœ์„œ, ์ฃผ๋กœ ์ค‘๋ณต์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผํšŒ์šฉ ํ† ํฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ณต๊ฐœ(public) ํด๋ ˆ์ž„ ๊ณต๊ฐœ ํด๋ ˆ์ž„๋“ค์€ ์ถฉ๋Œ์ด ๋ฐฉ์ง€๋œ(collision-resistant)์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ํด๋ ˆ์ž„ ์ด๋ฆ„์„ URIํ˜•์‹์œผ๋กœ ์ง“์Šต๋‹ˆ๋‹ค.

{ "<https://chup.tistory.com/jwt_claims/is_admin>" : true }

  1. ๋น„๊ณต๊ฐœ(private) ํด๋ ˆ์ž„ ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„๋„ ์•„๋‹ˆ๊ณ , ๊ณต๊ฐœ๋œ ํด๋ ˆ์ž„๋“ค๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์–‘ ์ธก๊ฐ„์—(๋ณดํ†ต ํด๋ผ์ด์–ธํŠธ <-> ์„œ๋ฒ„) ํ•ฉ์˜ํ•˜์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ ˆ์ž„ ์ด๋ฆ„๋“ค์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐœ ํด๋ ˆ์ž„๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ด๋ฆ„์ด ์ค‘๋ณต๋˜์–ด ์ถฉ๋Œ์ด ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์‚ฌ์šฉํ• ๋•Œ์— ์œ ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

3. ์„œ๋ช…(signature)

์„œ๋ช…์€ ํ—ค๋”์˜ ์ธ์ฝ”๋”ฉ๊ฐ’๊ณผ ์ •๋ณด์˜ ์ธ์ฝ”๋”ฉ๊ฐ’์„ ํ•ฉ์นœํ›„ ์ฃผ์–ด์ง„ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‰ฌ๋ฅผ ํ•˜์—ฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ํ•ด์‰ฌ๋ฅผ base64ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

โœจ ๋กœ๊ทธ์ธ ์ธ์ฆ์‹œ JWT ์‚ฌ์šฉ

๋งŒ์•ฝ ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง์€ Token์„ ๋ฐœ๊ธ‰ํ•˜๊ฒŒ๋˜๋ฉด ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ž์ฃผ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๋ฐ˜๋Œ€๋กœ ์œ ํšจ๊ธฐ๊ฐ„์ด ๊ธด Token์„ ๋ฐœ๊ธ‰ํ•˜๊ฒŒ๋˜๋ฉด ์ œ 3์ž์—๊ฒŒ ํ† ํฐ์„ ํƒˆ์ทจ๋‹นํ•  ๊ฒฝ์šฐ ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ์•ฝ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ ๋“ค์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด Refresh Token ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Refresh Token์€ Access Token๊ณผ ๋˜‘๊ฐ™์€ JWT์ž…๋‹ˆ๋‹ค. Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๋•Œ, Refresh Token์ด ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ์—ด์‡ ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Refresh Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์€ 1์ฃผ, Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์€ 1์‹œ๊ฐ„์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋Š” Access Token์œผ๋กœ 1์‹œ๊ฐ„๋™์•ˆ API์š”์ฒญ์„ ํ•˜๋‹ค๊ฐ€ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด Refresh Token์„ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ๋ฐœ๊ธ‰ํ•ด์ค๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•๋˜ํ•œ Access Token์ด ํƒˆ์ทจ๋‹นํ•œ๋‹คํ•ด๋„ ์ •๋ณด๊ฐ€ ์œ ์ถœ์ด ๋˜๋Š”๊ฑธ ๋ง‰์„ ์ˆ˜ ์—†์ง€๋งŒ, ๋” ์งง์€ ์œ ํšจ๊ธฐ๊ฐ„๋•Œ๋ฌธ์— ํƒˆ์ทจ๋˜๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์ ๋‹ค๋Š” ์ ์„ ์ด์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Refresh Token๋˜ํ•œ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋Š” ์ƒˆ๋กœ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Refresh Token๋„ ํƒˆ์ทจ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ์œ ํšจ๊ธฐ๊ฐ„ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

โœจ Access Token + Refresh Token ์ธ์ฆ ๊ณผ์ •

Authentication and Authorization

โœจ API Key

์„œ๋น„์Šค๋“ค์ด ๊ฑฐ๋Œ€ํ•ด์ง์— ๋”ฐ๋ผ ๊ธฐ๋Šฅ๋“ค์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์˜€๋Š”๋ฐ ์ด๋ฅผ์œ„ํ•ด Module์ด๋‚˜ Application๋“ค๊ฐ„์˜ ๊ณต์œ ์™€ ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ๋“ฑ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ ์ค‘ ์ œ์ผ ๋จผ์ € ๋“ฑ์žฅํ•˜๊ณ  ๊ฐ€์žฅ ๋„๋ฆฌ ๋ณดํŽธ์ ์œผ๋กœ ์“ฐ์ด๋Š” ๊ธฐ์ˆ ์ด API Key์ด๋‹ค.

โœจ ๋™์ž‘๋ฐฉ์‹

  1. ์‚ฌ์šฉ์ž๋Š” API Key๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. (๋ฐœ๊ธ‰ ๋ฐ›๋Š” ๊ณผ์ •์€ ์„œ๋น„์Šค๋“ค๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ๊ณต๊ณต๊ธฐ๊ด€ API๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์‹ ์ฒญ์— ํ•„์š”ํ•œ ์–‘์‹์„ ์ œ์ถœํ•˜๋ฉด ๊ด€๋ฆฌ์ž๊ฐ€ ํ™•์ธ ํ›„ Key๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.

  2. ํ•ด๋‹น API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Key์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

  3. Application์€ ์š”์ฒญ์ด ์˜ค๋ฉด Key๋ฅผ ํ†ตํ•ด User์ •๋ณด๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ˆ„๊ตฌ์˜ Key์ธ์ง€ ๊ถŒํ•œ์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

  4. ํ•ด๋‹น Key์˜ ์ธ์ฆ๊ณผ ์ธ๊ฐ€์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โœจ ๋ฌธ์ œ์ 

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

โœจ OAuth2

API Key์˜ ๋‹จ์ ์„ ๋ฉ”๊พธ๊ธฐ ์œ„ํ•ด ๋“ฑ์ž‘ํ•œ ๋ฐฉ์‹์ด๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ํŽ˜์ด์Šค๋ถ, ํŠธ์œ„ํ„ฐ ๋“ฑ SNS ๋กœ๊ทธ์ธ๊ธฐ๋Šฅ์—์„œ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์š”์ฒญํ•˜๊ณ  ์š”์ฒญ๋ฐ›๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ์ธ์ฆํ•˜๋Š” ๋ถ€๋ถ„์ด ์ถ”๊ฐ€๋˜์–ด ๋…๋ฆฝ์ ์œผ๋กœ ์„ธ๋ถ„ํ™”๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋‹ค.

โœจ ๋™์ž‘๋ฐฉ์‹

  1. ์‚ฌ์šฉ์ž๊ฐ€ Application์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. (๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ, ํŠน์ • ์ •๋ณด ์—ด๋žŒ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ๋กœ๊ทธ์ธ์œผ๋กœ ํ†ต์ผํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.)

  2. Application์€ ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

  3. Application์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆ์„œ๋ฒ„๋กœ Redirectionํ•œ๋‹ค.

  4. ๊ฐ„์ ‘์ ์œผ๋กœ Authorize ์š”์ฒญ์„ ๋ฐ›์€ ์ธ์ฆ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›์ธ์ง€ ๊ทธ๋ฆฌ๊ณ  ์ธ์ฆ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

  5. ์ธ์ฆ์„ ๊ฑฐ์ณค์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์ดˆ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ Grant๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๋Œ€์ฒด์ ์œผ๋กœ ์ธ์ฆ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์˜ ์˜์ง€๋ฅผ ํ™•์ธํ•˜๋Š” Grant์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๊ณ , ๊ฐ Application์€ ๋‹ค์‹œ ๊ถŒํ•œ์„ ๊ด€๋ฆฌ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž์˜ Grant๊ฐ€ ํ™•์ธ์ด ๋˜์ง€์•Š์œผ๋ฉด ๋‹ค์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ Grant์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

Grant๋ž€? Grant๋Š” ์ธ๊ฐ€์™€๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค. ์ธ๊ฐ€๋Š” ์„œ๋น„์Šค ์ œ๊ณต์ž ์ž…์žฅ์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๋ณด๋Š” ๊ฒƒ์ด์ง€๋งŒ, Grant๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์ธ์ฆ์ •๋ณด(๋ณดํ†ต ๊ฐœ์ธ์ •๋ณด์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฆ„, ์ด๋ฉ”์ผ ๋“ฑ)๋ฅผ Application์— ๋„˜๊ธธ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ Grant์š”์ฒญ์„ ๋ฐ›๊ฒŒ๋˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ์ธ์ฆ์ •๋ณด์— ๋Œ€ํ•œ ํ—ˆ๊ฐ€๋ฅผ ๋‚ด๋ ค์ค€๋‹ค. ํ•ด๋‹น ์š”์ฒญ์„ ํ†ตํ•ด ๋‹ค์‹œ ์ธ์ฆ์„œ๋ฒ„์— ์ธ๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

  2. ์ธ์ฆ์„œ๋ฒ„์—์„œ ์ธ์ฆ๊ณผ ์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ณผ์ •์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋ฉด Application์—๊ฒŒ ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•ด์ค€๋‹ค. ์ธ์ฆ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ์ž์‹ ์˜ ์ €์žฅ์†Œ์— ์ €์žฅ์„ ํ•ด๋‘”๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด ๋งค์šฐ ์งง์€ ๊ธฐ๊ฐ„๋™์•ˆ๋งŒ ์œ ํšจํ•˜๋‹ค.

  3. ์ธ๊ฐ€ ์ฝ”๋“œ๋Š” ์งง์€ ์‹œ๊ฐ„ ์œ ์ง€๋˜๊ธฐ ๋–„๋ฌธ์— ์ด์ œ Application์€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ Request Token์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ๋œ๋‹ค.

  4. ํ•ด๋‹น Request Token์„ ๋ฐ›์€ ์ธ์ฆ์„œ๋ฒ„๋Š” ์ž์‹ ์˜ ์ €์žฅ์†Œ์— ์ €์žฅํ•œ ์ฝ”๋“œ(7๋ฒˆ ๊ณผ์ •)๊ณผ ์ผ์น˜ํ•˜์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ธด ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์‹ค์ œ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋  Access Token์„ Application์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

  5. ์ด์ œ Application์€ Access Token์„ ํ†ตํ•ด ์—…๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น Access Token์„ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(์ธ์ฆ์„œ๋ฒ„์™€๋Š” ๋‹ค๋ฆ„)์— ์š”์ฒญ์„ ํ•˜๊ฒŒ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ณผ์ •์—์„œ๋„ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ธ์ฆ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•ด๋‹น ํ† ํฐ์ด ์œ ํšจํ•œ์ง€ ํ™•์ธ์„ ๊ฑฐ์น˜๊ฒŒ๋œ๋‹ค. ํ•ด๋‹น ํ† ํฐ์ด ์œ ํšจํ•˜๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋“œ๋””์–ด ์š”์ฒญํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

โœจ ๋ฌธ์ œ์ 

๊ธฐ์กด API Key๋ฐฉ์‹์— ๋น„ํ•ด ์ข€ ๋” ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฌผ๋ก  ๋งŽ์€ ๋ถ€๋ถ„์ด ๊ฐœ์„ ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ†ต์‹ ์— ์‚ฌ์šฉํ•˜๋Š” Token์€ ๋ฌด์˜๋ฏธํ•œ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •ํ•ด์ง„ ๊ทœ์น™์—†์ด ๋ฐœํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฆ๋ช…ํ™•์ธ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ธ์ฆ์„œ๋ฒ„์— ์–ด๋–ค ์‹์ด๋“  DBMS ์ ‘๊ทผ์ด๋“  ๋‹ค๋ฅธ API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•˜๋Š” ๋“ฑ์˜ ์œ ํšจ์„ฑ ํ™•์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ณต์ฆ ์—ฌ๋ถ€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณต์ฆ์—ฌ๋ถ€ ๋ฌธ์ œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ํšจ๊ธฐ๊ฐ„ ๋ฌธ์ œ๋„ ์žˆ๋‹ค.

โœจ JWT

JWT๋Š” JSON Web Token์˜ ์ค„์ž„๋ง๋กœ ์ธ์ฆ ํ๋ฆ„์˜ ๊ทœ์•ฝ์ด ์•„๋‹Œ Token ์ž‘์„ฑ์— ๋Œ€ํ•œ ๊ทœ์•ฝ์ด๋‹ค. ๊ธฐ๋ณธ์ ์ธ Access Token์€ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด Token์˜ ์ง„์œ„๋‚˜ ์œ ํšจ์„ฑ์„ ๋งค๋ฒˆ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž„์— ๋ฐ˜ํ•˜์—ฌ, JWT๋Š” ์ธ์ฆ์—ฌ๋ถ€ ํ™•์ธ์„ ์œ„ํ•œ ๊ฐ’, ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ์œ„ํ•œ ๊ฐ’ ๊ทธ๋ฆฌ๊ณ  ์ธ์ฆ ์ •๋ณด ์ž์ฒด๋ฅผ ๋‹ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ์„œ๋ฒ„์— ๋ฌป์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ† ํฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์ธ์ฆ๋ฐฉ์‹์€ JWT๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์ž.

๋ฌธ์ œ์ 

์„œ๋ฒ„์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์—ฌ ์ธ์ฆ์„ ํ•™์ธํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ์žฅ์ ๋“ค์ด ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ํ† ํฐ ์ž์ฒด๊ฐ€ ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ธ์ฆ์„œ๋ฒ„์— ๋‹ค์‹œ ์ ‘์†ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

๋กœ๊ทธ ๋ ˆ๋ฒจ

โœจ Logging Level

๋ณดํ†ต log4j ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

ํฌ๊ฒŒ ERROR, WARN, INFO, DEBUG๋กœ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑํ•œ๋‹ค.

  • ERROR

    ์—๋Ÿฌ ๋กœ๊ทธ๋Š”, ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์— ํฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ์ฆ‰์‹œ ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ

    DB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ, ์ค‘์š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ค๋Š” ์ƒํ™ฉ

  • WARN

    ์ฃผ์˜ํ•ด์•ผ ํ•˜์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ„์† ์ง„ํ–‰๋˜๋Š” ์ƒํƒœ. ํ•˜์ง€๋งŒ WARN์—์„œ๋„ 2๊ฐ€์ง€์˜ ๋ถ€๋ถ„์—์„  ์ข…๋ฃŒ๊ฐ€ ์ผ์–ด๋‚จ

    • ๋ช…ํ™•ํ•œ ๋ฌธ์ œ : ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ์บ์‹œ๊ฐ’ ์‚ฌ์šฉ ๋“ฑ

    • ์ž ์žฌ์  ๋ฌธ์ œ : ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘, ๊ด€๋ฆฌ์ž ์ฝ˜์†” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋ณดํ˜ธ๋˜์ง€ ์•Š๊ณ  ์ ‘์† ๋“ฑ

  • INFO

    ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ์™€ ์ข…๋ฃŒ๋  ๋•Œ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋กœ๊ทธ

    ~๊ฐ€ ~๋ฅผ ์‹คํ–‰ํ–ˆ์Œ

  • DEBUG

    ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋กํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ๋ฒจ

UI ์™€ UX

๋งŽ์ด ๋“ค์–ด๋ดค์ง€๋งŒ, ์ฐจ์ด๋ฅผ ๋งํ•˜๋ผ๊ณ  ํ•˜๋ฉด ๋ฉˆ์นซํ•œ๋‹ค. ๋ฉด์ ‘์—์„œ๋„ ์›น์„ ํ–ˆ๋‹ค๊ณ  ํ•˜๋ฉด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์งˆ๋ฌธ.

โœจ UI

User Interface

์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ์ฃผํ•˜๋Š” ๋””์ž์ธ, ๋ ˆ์ด์•„์›ƒ, ๊ธฐ์ˆ ์ ์ธ ๋ถ€๋ถ„์ด๋‹ค.

๋””์ž์ธ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ ํฐํŠธ, ์ƒ‰๊น”, ์ค„๊ฐ„๊ฒฉ ๋“ฑ ์ƒ์„ธํ•œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜๊ณ , ๊ธฐ์ˆ ์  ๋ถ€๋ถ„์€ ๋ฐ˜์‘ํ˜•์ด๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ํšจ๊ณผ ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.

๋”ฐ๋ผ์„œ UI๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ๋•Œ ํฐ ๋ถˆํŽธํ•จ์ด ์—†์–ด์•ผํ•˜๋ฉฐ, ๋งŒ์กฑ๋„๋ฅผ ๋†’์—ฌ์•ผ ํ•œ๋‹ค.

โœจ UX

User eXperience

์•ฑ์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๋“ค์˜ ๊ฒฝํ—˜์„ ๋ถ„์„ํ•˜์—ฌ ๋” ํŽธํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉํ–ฅ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

(ํ„ฐ์น˜ ํ™”๋ฉด, ์‚ฌ์šฉ์ž์˜ ์„ ํƒ flow ๋“ฑ)

UX๋Š” ํ†ต๊ณ„์ž๋ฃŒ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €๋“ค์˜ ํŠน์„ฑ์„ ๋ถ„์„ํ•˜์—ฌ ์ƒํ™ฉ๊ณผ ์‹œ์ ์— ๋งž๋„๋ก ๋ณ€ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

UI๋ฅผ ํฌ์žฅ๋ฌผ์— ๋น„์œ ํ•œ๋‹ค๋ฉด, UX๋Š” ๊ทธ ์•ˆ์˜ ๋‚ด์šฉ๋ฌผ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํฌ์žฅ(UI)์— ์‹ ๊ฒฝ์„ ์“ฐ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•  ์‚ฌ๋žŒ์„ ๋ถ„์„ํ•ด ์•Œ๋งž์€ ๋‚ด์šฉ๋ฌผ(UX)๋กœ ์ฑ„์›Œ์„œ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค.

CSR & SSR

CSR : Client Side Rendering

SSR : Server Side Rendering

CSR์—๋Š” ๋ชจ๋ฐ”์ผ ์‹œ๋Œ€์— ๋“ค์–ด์„œ SPA๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.

โœจ SPA(Single Page Applictaion)

์ตœ์ดˆ ํ•œ ๋ฒˆ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋กœ๋”ฉํ•œ ๋’ค, ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

SPA๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽ˜์ด์ง€ ๋กœ๋“œ๊ฐ€ ์—†๊ณ , ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๋‹จ์ˆœํžˆ Html5 History์— ์˜ํ•ด ๋ Œ๋”๋ง๋œ๋‹ค.

๊ธฐ์กด์˜ ์ „ํ†ต์  ๋ฐฉ๋ฒ•์ธ SSR ๋ฐฉ์‹์—๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

์š”์ฆ˜ ์›น์—์„œ ์ œ๊ณต๋˜๋Š” ์ •๋ณด๊ฐ€ ์›Œ๋‚™ ๋งŽ๋‹ค. ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ๊ณ ์นจ์ด ์ผ์–ด๋‚˜๋ฉด์„œ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํ•ด์„ํ•˜๊ณ , ํ™”๋ฉด์— ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ธ SSR์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์„ฑ๋Šฅ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

ํ˜„์žฌ ์ฃผ์†Œ์—์„œ ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์„ค์ •ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค.

์ด๋Š”, ์ธํ„ฐ๋ž™์…˜์ด ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋ Œ๋”๋ง์„ ์„œ๋ฒ„์ชฝ์—์„œ ์ง„ํ–‰ํ•˜๋ฉด ๊ทธ๋งŒํผ ์„œ๋ฒ„ ์ž์›์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ์ด ๋‚ญ๋น„๋œ๋‹ค.

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

๋ทฐ ๋ Œ๋”๋ง์„ ์œ ์ €์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ด๋‹นํ•˜๊ณ , ๋จผ์ € ์›น์•ฑ์„ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋กœ๋“œํ•œ ๋‹ค์Œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌ๋ฐ›์•„ ๋ณด์—ฌ์ฃผ๋Š” CSR์€ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ์†Œ์‹œํ‚ค๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

โœจ CSR ์žฅ๋‹จ์ 

  • ์žฅ์ 

    • ํŠธ๋ž˜ํ”ฝ ๊ฐ์†Œ

      ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›๋Š”๋‹ค

    • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜

      ์ƒˆ๋กœ๊ณ ์นจ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ. ์‚ฌ์šฉ์ž๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๊ฐ™์€ ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์Œ

  • ๋‹จ์ 

    • ๊ฒ€์ƒ‰ ์—”์ง„

      ํฌ๋กฌ์—์„œ ๋ฆฌ์•กํŠธ๋กœ ๋งŒ๋“  ์›น์•ฑ ์†Œ์Šค๋ฅผ ํ™•์ธํ•˜๋ฉด ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์Œ. ์ด์ฒ˜๋Ÿผ ๊ฒ€์ƒ‰์—”์ง„ ํฌ๋กค๋Ÿฌ๊ฐ€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์— ์–ด๋ ค์›€์ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

      ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์—”์ง„์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋‚ด์žฅ๋˜์–ด์žˆ์ง€๋งŒ, ๋„ค์ด๋ฒ„๋‚˜ ๋‹ค์Œ ๋“ฑ ๊ฒ€์ƒ‰์—”์ง„์€ ํฌ๋กค๋ง์— ์–ด๋ ค์›€์ด ์žˆ์–ด SSR์„ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€ ์กด์žฌ

โœจ SSR ์žฅ๋‹จ์ 

  • ์žฅ์ 

    • ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”

    • ์ดˆ๊ธฐ๋กœ๋”ฉ ์„ฑ๋Šฅ๊ฐœ์„ 

      ์ฒซ ๋ Œ๋”๋ง๋œ HTML์„ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „๋‹ฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ๋กœ๋”ฉ์†๋„๋ฅผ ๋งŽ์ด ์ค„์—ฌ์คŒ

  • ๋‹จ์ 

    • ํ”„๋กœ์ ํŠธ ๋ณต์žก๋„

      ๋ผ์šฐํ„ฐ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ๋ณต์žก๋„๊ฐ€ ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Œ

    • ์„ฑ๋Šฅ ์•…ํ™” ๊ฐ€๋Šฅ์„ฑ

๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ & ์›น ์•ฑ & ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ

โœจ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ (Native App)

ํ”ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜๋ฏธํ•œ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์— ์ตœ์ ํ™”๋œ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ ์•ฑ์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ SDK๋ฅผ ์ด์šฉํ•œ Java ์–ธ์–ด๋‚˜ iOS ๊ธฐ๋ฐ˜ SDK๋ฅผ ์ด์šฉํ•œ Swift ์–ธ์–ด๋กœ ๋งŒ๋“œ๋Š” ์•ฑ์ด ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์— ์†ํ•œ๋‹ค.

โœจ ์žฅ์ 

  • ์„ฑ๋Šฅ์ด ์›น์•ฑ, ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์— ๋น„ํ•ด ๊ฐ€์žฅ ๋†’์Œ

  • ๋„ค์ดํ‹ฐ๋ธŒ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•จ์œผ๋กœ ํ”Œ๋žซํผ๊ณผ ๋ฐ€์ฐฉ๋˜์–ด์žˆ์Œ

  • Java๋‚˜ Swift์— ์ต์ˆ™ํ•œ ์‚ฌ์šฉ์ž๋ฉด ์‰ฝ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•จ

โœจ ๋‹จ์ 

  • ํ”Œ๋žซํผ์— ํ•œ์ •์ 

  • ์–ธ์–ด์— ์ œ์•ฝ์ 

โœจ ๋ชจ๋ฐ”์ผ ์›น ์•ฑ (Mobile Wep App)

๋ชจ๋ฐ”์ผ์›น + ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์„ ๊ฒฐํ•ฉํ•œ ํ˜•ํƒœ

๋ชจ๋ฐ”์ผ ์›น์˜ ํŠน์ง•์„ ๊ฐ€์ง€๋ฉด์„œ๋„, ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์˜ ์žฅ์ ์„ ์ง€๋…”๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด์˜ ๋ชจ๋ฐ”์ผ ์›น๋ณด๋‹ค๋Š” ๋ชจ๋ฐ”์ผ์— ์ตœ์ ํ™” ๋œ ์•ฑ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

์›น์•ฑ์€ SPA๋ฅผ ํ™œ์šฉํ•ด ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด, PC์šฉ ํ™ˆํŽ˜์ด์ง€๋ฅผ ๋ชจ๋ฐ”์ผ ์Šคํฌ๋ฆฐ ํฌ๊ธฐ์— ๋งž์ถฐ ์ค„์—ฌ ๋†“์€ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•จ

โœจ ์žฅ์ 

  • ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋”ฐ๋กœ ์„ค์น˜ํ•  ํ•„์š”X

  • ๋ชจ๋“  ๊ธฐ๊ธฐ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ

  • ๋ณ„๋„ ์„ค์น˜ ๋ฐ ์Šน์ธ ๊ณผ์ •์ด ํ•„์š”์น˜ ์•Š์•„ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ด

โœจ ๋‹จ์ 

  • ํ”Œ๋žซํผ API ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ. ์˜ค๋กœ์ง€ ๋ธŒ๋ผ์šฐ์ € API๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ

  • ์นœํ™”์  ํ„ฐ์น˜ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์•ฝ๊ฐ„ ๋ฒˆ๊ฑฐ๋กœ์›€

  • ๋„ค์ดํ‹ฐ๋ธŒ, ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ๋ณด๋‹ค ์‹คํ–‰ ๊นŒ๋‹ค๋กœ์›€ (๋ธŒ๋ผ์šฐ์ € ์—ด๊ฑฐ ๊ฒ€์ƒ‰ํ•ด์„œ ๋“ค์–ด๊ฐ€์•ผํ•จ)

โœจ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ (Hybrid App)

๋„ค์ดํ‹ฐ๋ธŒ + ์›น์•ฑ

๋„ค์ดํ‹ฐ๋ธŒ ์›น์—, ์›น view๋ฅผ ๋„์›Œ ์›น์•ฑ์„ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์–‘์ชฝ์˜ API๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์žฅ์ 

โœจ ์žฅ์ 

  • ๋„ค์ดํ‹ฐ๋ธŒ API, ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ๋ชจ๋‘ ํ™œ์šฉํ•œ ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

  • ์›น ๊ฐœ๋ฐœ ๊ธฐ์ˆ ๋กœ ์•ฑ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

  • ํ•œ๋ฒˆ์˜ ๊ฐœ๋ฐœ๋กœ ๋‹ค์ˆ˜ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โœจ ๋‹จ์ 

  • ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ ์ ‘๊ทผ ์œ„ํ•ด ๊ฐœ๋ฐœ ์ง€์‹ ํ•„์š”

  • UI ํ”„๋ ˆ์ž„๋„๊ตฌ ์‚ฌ์šฉ์•ˆํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ UI ์ œ์ž‘

PWA (Progressive Web App)

์›น์˜ ์žฅ์ ๊ณผ ์•ฑ์˜ ์žฅ์ ์„ ๊ฒฐํ•ฉํ•œ ํ™˜๊ฒฝ

์•ฑ ์ˆ˜์ค€๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์›น์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ !

โœจ ํŠน์ง•

ํ™•์žฅ์„ฑ์ด ์ข‹๊ณ , ๊นŠ์ด ์žˆ๋Š” ์•ฑ๊ฐ™์€ ์›น์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ง€ํ–ฅํ•œ๋‹ค.

์›น ์ฃผ์†Œ๋งŒ ์žˆ๋‹ค๋ฉด, ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์Šค๋งˆํŠธํฐ์˜ ์ €์žฅ๊ณต๊ฐ„์„ ์žก์•„ ๋จน์ง€ ์•Š์Œ

์„œ๋น„์Šค ์ž‘์—…์ž(Service Worker) API : ์›น์•ฑ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์บ์‹ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ์— ์—ด ๋•Œ ๋น ๋ฅด๊ฒŒ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ

โ†’ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์ด ์ข‹์ง€ ์•Š์•„๋„ ๋น ๋ฅด๊ฒŒ ๊ตฌ๋™๋˜๋ฉฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Œ

โœจ PWA ์ œ๊ณต ๊ธฐ๋Šฅ

  • ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ : ์ ์ง„์  ๊ฐœ์„ ์„ ํ†ตํ•ด ์ž‘์„ฑ๋˜์„œ ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €๋“  ์ƒ๊ด€์—†์ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ํ•ฉ

  • ๋ฐ˜์‘ํ˜• : ๋ฐ์Šคํฌํ†ฑ, ๋ชจ๋ฐ”์ผ, ํ…Œ๋ธ”๋ฆฟ ๋“ฑ ๋ชจ๋“  ํผ factor์— ๋งž์Œ

  • ์—ฐ๊ฒฐ ๋…๋ฆฝ์  : ์„œ๋น„์Šค ์›Œ์ปค๋ฅผ ์‚ฌ์šฉํ•ด ์˜คํ”„๋ผ์ธ์—์„œ๋„ ์ž‘๋™์ด ๊ฐ€๋Šฅํ•จ

  • ์•ˆ์ „ : HTTPS๋ฅผ ํ†ตํ•ด ์ œ๊ณต์ด ๋˜๋ฏ€๋กœ ์Šค๋ˆ„ํ•‘์ด ์ฐจ๋‹จ๋˜์–ด ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€์กฐ๋˜์ง€ ์•Š์Œ

  • ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ : W3C ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ฐ ์„œ๋น„์Šค ์›Œ์ปค ๋“ฑ๋ก ๋ฒ”์œ„ ๋•๋ถ„์— '์•ฑ'์œผ๋กœ ์‹๋ณ„๋˜์–ด ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•จ

  • ์žฌ์ฐธ์—ฌ ๊ฐ€๋Šฅ : ํ‘ธ์‹œ ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์žฌ์ฐธ์—ฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ

CSRF & XSS

โœจCSRF

Cross Site Request Forgery

์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋กœ, ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„ (modify, delete, register ๋“ฑ)๋ฅผ ํŠน์ •ํ•œ ์›น์‚ฌ์ดํŠธ์— requestํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ์„ ๋งํ•œ๋‹ค.

์ฃผ๋กœ ํ•ด์ปค๋“ค์ด ๋งŽ์ด ์ด์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์œ ์ €์˜ ๊ถŒํ•œ์„ ๋„์šฉํ•ด ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์‹ค์ƒํ™œ์—์„œ CSRF ๊ณต๊ฒฉ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฑด, ํ•ด์ปค๊ฐ€ ์‚ฌ์šฉ์ž์˜ SNS ๊ณ„์ •์œผ๋กœ ๊ด‘๊ณ ์„ฑ ๊ธ€์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, CSRF๋Š” ํ•ด์ปค๊ฐ€ ์‚ฌ์šฉ์ž ์ปดํ“จํ„ฐ๋ฅผ ๊ฐ์—ผ์‹œ๊ฑฐ๋‚˜ ์„œ๋ฒ„๋ฅผ ํ•ดํ‚นํ•ด์„œ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. CSRF ๊ณต๊ฒฉ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์กฐ๊ฑด์ด ๋งŒ์กฑํ•  ๋•Œ ์‹คํ–‰๋œ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด์ปค๊ฐ€ ๋งŒ๋“  ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•œ ๊ฒฝ์šฐ

  • ์œ„์กฐ ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ์„œ๋น„์Šค์— ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•œ ์ƒํ™ฉ

๋ณดํ†ต ์ž๋™ ๋กœ๊ทธ์ธ์„ ํ•ด๋‘” ๊ฒฝ์šฐ์— ์ด๋Ÿฐ ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ํ”ผํ•ด๋ฅผ ์ž…๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋˜ํ•œ, ํ•ด์ปค๊ฐ€ XSS ๊ณต๊ฒฉ์„ ์„ฑ๊ณต์‹œํ‚จ ์‚ฌ์ดํŠธ๋ผ๋ฉด, ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ CSRF ๊ณต๊ฒฉ์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

โœจ ๋Œ€์‘ ๊ธฐ๋ฒ•

  • ๋ฆฌํผ๋Ÿฌ(Refferer) ๊ฒ€์ฆ

    ๋ฐฑ์—”๋“œ ๋‹จ์—์„œ Refferer ๊ฒ€์ฆ์„ ํ†ตํ•ด ์Šน์ธ๋œ ๋„๋ฉ”์ธ์œผ๋กœ ์š”์ฒญ์‹œ์—๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.

  • Security Token ์‚ฌ์šฉ

    ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์— ์ž„์˜์˜ ๋‚œ์ˆ˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์‹œ ํ•ด๋‹น ๊ฐ’์„ ํฌํ•จํ•˜์—ฌ ์ „์†ก์‹œํ‚จ๋‹ค. ๋ฐฑ์—”๋“œ ๋‹จ์—์„œ๋Š” ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ ์„ธ์…˜์— ์ €์žฅ๋œ ํ† ํฐ๊ฐ’๊ณผ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ํ† ํฐ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ์ง€ ๊ฒ€์ฆ ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

ํ•˜์ง€๋งŒ, XSS์— ์ทจ์•ฝ์ ์ด ์žˆ๋‹ค๋ฉด ๊ณต๊ฒฉ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค.

โœจ XSS

Cross Site Scription

CSRF์™€ ๊ฐ™์ด ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋กœ, ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค.

์•…์˜์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์ด๋ฅผ ์—ด๋žŒํ•œ ์‚ฌ์šฉ์ž์˜ ์ฟ ํ‚ค๊ฐ€ ํ•ด์ปค์—๊ฒŒ ์ „์†ก์‹œํ‚ค๋ฉฐ, ์ด ํƒˆ์ทจํ•œ ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ์„ธ์…˜ ํ•˜์ด์žฌํ‚น ๊ณต๊ฒฉ์„ ํ•œ๋‹ค. ํ•ด์ปค๋Š” ์„ธ์…˜ID๋ฅผ ๊ฐ€์ง„ ์ฟ ํ‚ค๋กœ ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •์— ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๊ณต๊ฒฉ ์ข…๋ฅ˜๋กœ๋Š” ์ง€์†์„ฑ, ๋ฐ˜์‚ฌํ˜•, DOM ๊ธฐ๋ฐ˜ XSS ๋“ฑ์ด ์žˆ๋‹ค.

  • ์ง€์†์„ฑ : ๋ง ๊ทธ๋Œ€๋กœ ์ง€์†์ ์œผ๋กœ ํ”ผํ•ด๋ฅผ ์ž…ํžˆ๋Š” ์œ ํ˜•์œผ๋กœ, XSS ์ทจ์•ฝ์ ์ด ์กด์žฌํ•˜๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์—ด๋žŒํ•œ ์‚ฌ์šฉ์ž์˜ ์ฟ ํ‚ค๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์‹œํ‚ค๋Š” ๊ณต๊ฒฉ์„ ํ•œ๋‹ค. ์ด๋•Œ ์‚ฝ์ž…๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ์‹œ์ผœ ์ง€์†์ ์œผ๋กœ ๊ณต๊ฒฉ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Persistent XSS๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.

  • ๋ฐ˜์‚ฌํ˜• : ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž…๋ ฅ ๋ฐ›์€ ๊ฐ’์„ ์„œ๋ฒ„์—์„œ ๋˜๋Œ๋ ค ์ฃผ๋Š” ๊ณณ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์•…์˜ ์Šคํฌ๋ฆฝํŠธ์™€ ํ•จ๊ป˜ URL์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ˆ„๋ฅด๋„๋ก ์œ ๋„ํ•˜๊ณ , ๋ˆ„๋ฅธ ์‚ฌ์šฉ์ž๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์–ด ๊ณต๊ฒฉ์„ ๋‹นํ•˜๊ฒŒ ๋˜๋Š” ์œ ํ˜•์ด๋‹ค.

  • DOM ๊ธฐ๋ฐ˜ : ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ URL์„ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ•ด์„ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋กœ ์ธํ•ด ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ๊ฐ€ ์›๋ž˜ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ์‹คํ–‰๋œ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ XSS ๊ณต๊ฒฉ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์„œ๋ฒ„ ์ธก์—์„œ ํƒ์ง€๊ฐ€ ์–ด๋ ต๋‹ค.

โœจ ๋Œ€์‘ ๊ธฐ๋ฒ•

  • ์ž…์ถœ๋ ฅ ๊ฐ’ ๊ฒ€์ฆ

    XSS Cheat Sheet์— ๋Œ€ํ•œ ํ•„ํ„ฐ ๋ชฉ๋ก์„ ๋งŒ๋“ค์–ด ๋ชจ๋“  Cheat Sheet์— ๋Œ€ํ•œ ๋Œ€์‘์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ์‚ฌ์ „์— ๋Œ€๋น„ํ•œ๋‹ค. XSS ํ•„ํ„ฐ๋ง์„ ์ ์šฉ ํ›„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ์ง์ ‘ ํ…Œ์ŠคํŠธ ๊ณผ์ •์„ ๊ฑฐ์ณ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค,

  • XSS ๋ฐฉ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ™•์žฅ์•ฑ

    Anti XSS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ํšŒ์‚ฌ๋“ค์ด ๋งŽ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„œ๋ฒ„๋‹จ์—์„œ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž๋“ค์€ ๊ฐ์ž ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ™•์žฅ์•ฑ์„ ์„ค์น˜ํ•˜์—ฌ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์›น ๋ฐฉํ™”๋ฒฝ

    ์›น ๋ฐฉํ™”๋ฒฝ์€ ์›น ๊ณต๊ฒฉ์— ํŠนํ™”๋œ ๊ฒƒ์œผ๋กœ, ๋‹ค์–‘ํ•œ Injection์„ ํ•œ๊บผ๋ฒˆ์— ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

  • CORS, SOP ์„ค์ •

    CORS(Cross-Origin Resource Sharing), SOP(Same-Origin-Policy)๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค์˜ Source๋ฅผ ์ œํ•œ ํ•˜๋Š”๊ฒƒ์ด ํšจ๊ณผ์ ์ธ ๋ฐฉ์–ด ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์›น ์„œ๋น„์Šค์ƒ ์ทจ์•ฝํ•œ ๋ฒกํ„ฐ์— ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž… ํ•  ๊ฒฝ์šฐ, ์น˜๋ช…์ ์ธ ๊ณต๊ฒฉ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž…๋ ฅ๊ฐ’ ์ œํ•œ์ด๋‚˜ ๊ธฐํƒ€ ์š”์ธ ๋•Œ๋ฌธ์— ๊ณต๊ฒฉ ์„ฑ๊ณต์ด ์–ด๋ ต๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ฒฉ์ž์˜ ์„œ๋ฒ„์— ์œ„์น˜ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถˆ๋Ÿฌ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์›Œ์ง„๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋–„๋ฌธ์— CORS, SOP๋ฅผ ํ™œ์šฉ ํ•˜์—ฌ ์‚ฌ์ „์— ์ง€์ •๋œ ๋„๋ฉ”์ธ์ด๋‚˜ ๋ฒ”์œ„๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๊ฒŒ ์ œํ•œํ•ด์•ผ ํ•œ๋‹ค.

Last updated