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