Web Authentication API(WebAuthn)λ₯Ό μμλ³΄κ³ μΉμ¬μ΄νΈλ μ ν리μΌμ΄μ μ μμ ν λΉλ°λ²νΈ μλ λ‘κ·ΈμΈμ ꡬννλ λ°©λ²μ λ°°μ보μΈμ. μ΄ μ΅μ μΈμ¦ λ°©μμΌλ‘ 보μκ³Ό μ¬μ©μ κ²½νμ ν₯μμν€μΈμ.
Web Authentication API: λΉλ°λ²νΈ μλ λ‘κ·ΈμΈ κ΅¬νμ μν μ’ ν© κ°μ΄λ
μ€λλ μ λμ§νΈ νκ²½μμ 보μμ κ°μ₯ μ€μν©λλ€. κΈ°μ‘΄μ λΉλ°λ²νΈ κΈ°λ° μΈμ¦ λ°©μμ νΌμ±, λ¬΄μ°¨λ³ λμ 곡격, ν¬λ¦¬λ΄μ μ€ν°νκ³Ό κ°μ 곡격μ μ μ λ μ·¨μ½ν΄μ§κ³ μμ΅λλ€. FIDO2 CTAP(Client to Authenticator Protocol)λΌκ³ λ μλ €μ§ Web Authentication API(WebAuthn)λ νλμ μ΄κ³ μμ νλ©° μ¬μ©μ μΉνμ μΈ λμμΈ λΉλ°λ²νΈ μλ λ‘κ·ΈμΈμ μ 곡ν©λλ€. μ΄ μ’ ν© κ°μ΄λμμλ WebAuthnμ μμΉ, μ΄μ , κ·Έλ¦¬κ³ μΉ μ ν리μΌμ΄μ μ ν¨κ³Όμ μΌλ‘ ꡬννλ λ°©λ²μ μλ΄ν©λλ€.
Web Authentication API(WebAuthn)λ 무μμΈκ°?
Web Authentication API(WebAuthn)λ μΉμ¬μ΄νΈμ μ ν리μΌμ΄μ μ΄ μ체 μΈμ¦(μ§λ¬Έ, μΌκ΅΄ μΈμ), νλμ¨μ΄ 보μ ν€(YubiKey, Titan 보μ ν€), νλ«νΌ μΈμ¦μ(Windows Hello, macOSμ Touch ID)μ κ°μ κ°λ ₯ν μΈμ¦ λ°©λ²μ μ¬μ©μ μΈμ¦μ νμ©ν μ μλλ‘ νλ μΉ νμ€μ λλ€. μ΄λ λΉλ°λ²νΈλ₯Ό λ μμ νκ³ νΈλ¦¬ν λμμΌλ‘ λ체νλ κ²μ λͺ©νλ‘ νλ κ°λ°©ν μΈμ¦ νμ€μΈ FIDO2 νλ‘μ νΈμ ν΅μ¬ κ΅¬μ± μμμ λλ€.
WebAuthnμ κ³΅κ° ν€ μνΈν μ리μ λ°λΌ μλν©λλ€. μλ²μ λΉλ°λ²νΈλ₯Ό μ μ₯νλ λμ , μνΈν ν€ μμ μμ‘΄ν©λλ€. μ¦, μ¬μ©μμ κΈ°κΈ°μ μμ νκ² μ μ₯λ κ°μΈ ν€μ μΉμ¬μ΄νΈ λλ μ ν리μΌμ΄μ μ λ±λ‘λ κ³΅κ° ν€μ λλ€. μ¬μ©μκ° λ‘κ·ΈμΈμ μλν λ, μ체 μΈμ μΌμλ 보μ ν€λ₯Ό μ¬μ©νμ¬ λ‘컬μμ μΈμ¦νλ©°, μ΄λ κ°μΈ ν€μ μ κΈμ ν΄μ νκ³ λΈλΌμ°μ κ° κ°μΈ ν€ μ체λ₯Ό μ μ‘νμ§ μκ³ λ μλ²μ μ μμ μ¦λͺ νλ μλͺ λ μ΄μ€μ (assertion)μ μμ±νλλ‘ ν©λλ€. μ΄ μ κ·Ό λ°©μμ λΉλ°λ²νΈ κ΄λ ¨ 곡격μ μνμ ν¬κ² μ€μ¬μ€λλ€.
WebAuthn ꡬνμ μ΄μ
- ν₯μλ 보μ: WebAuthnμ λΉλ°λ²νΈλ₯Ό μ κ±°νμ¬ νΌμ±, λ¬΄μ°¨λ³ λμ 곡격, ν¬λ¦¬λ΄μ μ€ν°νκ³Ό κ°μ λΉλ°λ²νΈ κΈ°λ° κ³΅κ²©μΌλ‘λΆν° μ ν리μΌμ΄μ μ 보νΈν©λλ€. μ¬μ©μμ κΈ°κΈ°λ₯Ό λ λμ§ μλ κ°μΈ ν€ μ¬μ©μ μΆκ°μ μΈ λ³΄μ κ³μΈ΅μ λν©λλ€.
- κ°μ λ μ¬μ©μ κ²½ν: λΉλ°λ²νΈ μλ λ‘κ·ΈμΈμ μΈμ¦ κ³Όμ μ λ¨μνν©λλ€. μ¬μ©μλ 볡μ‘ν λΉλ°λ²νΈλ₯Ό κΈ°μ΅νκ³ μ λ ₯ν νμ μμ΄ μ체 μΈμ¦μ΄λ 보μ ν€λ₯Ό μ¬μ©νμ¬ λΉ λ₯΄κ³ μ½κ² λ‘κ·ΈμΈν μ μμ΅λλ€. μ΄ κ°μνλ κ²½νμ μ¬μ©μ λ§μ‘±λμ μ°Έμ¬λλ₯Ό λμΌ μ μμ΅λλ€.
- νΌμ± μ νμ±: WebAuthn μΈμ¦μλ μΉμ¬μ΄νΈ λλ μ ν리μΌμ΄μ μ μ€λ¦¬μ§(λλ©μΈ)μ λ°μΈλ©λ©λλ€. μ΄λ 곡격μκ° μ¬κΈ°μ± μΉμ¬μ΄νΈμμ νμΉ μ격 μ¦λͺ μ μ¬μ©νλ κ²μ λ°©μ§νμ¬ WebAuthnμ΄ νΌμ± 곡격μ λ§€μ° κ°ν μ νμ±μ κ°κ² ν©λλ€.
- κ΅μ°¨ νλ«νΌ νΈνμ±: WebAuthnμ λͺ¨λ μ£Όμ λΈλΌμ°μ μ μ΄μ체μ μμ μ§μλλ―λ‘ λ€μν κΈ°κΈ°μ νλ«νΌμμ μΌκ΄λ μΈμ¦ κ²½νμ 보μ₯ν©λλ€. μ΄λ¬ν κ΄λ²μν νΈνμ± λλΆμ λ€μν μΉ μ ν리μΌμ΄μ μ μ μ© κ°λ₯ν μ루μ μ λλ€.
- κ·μ μ€μ λ° νμ€ν: μΉ νμ€μΈ WebAuthnμ μ‘°μ§μ΄ 보μ κ·μ λ° μ κ³ λͺ¨λ² μ¬λ‘λ₯Ό μ€μνλ λ° λμμ μ€λλ€. νμ€νλ λ€μν μΈμ¦μμ νλ«νΌ κ°μ μνΈ μ΄μ©μ±μ 보μ₯ν©λλ€.
- μ§μ λΉμ© μ κ°: λΉλ°λ²νΈλ₯Ό μ κ±°ν¨μΌλ‘μ¨ WebAuthnμ λΉλ°λ²νΈ μ¬μ€μ , κ³μ 볡ꡬ, 보μ μΉ¨ν΄μ κ΄λ ¨λ μ§μ λΉμ©μ ν¬κ² μ€μΌ μ μμ΅λλ€.
WebAuthnμ ν΅μ¬ κ°λ
WebAuthnμ ν¨κ³Όμ μΌλ‘ ꡬννλ €λ©΄ λ€μ ν΅μ¬ κ°λ μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€:
- μ λ’° λΉμ¬μ(Relying Party, RP): μΈμ¦μ μν΄ WebAuthnμ μ¬μ©νλ μΉμ¬μ΄νΈ λλ μ ν리μΌμ΄μ μ λλ€. RPλ μΈμ¦ νλ‘μΈμ€λ₯Ό μμνκ³ μ¬μ©μμ μ μμ νμΈνλ μ± μμ μ§λλ€.
- μΈμ¦μ(Authenticator): μνΈν ν€λ₯Ό μμ± λ° μ μ₯νκ³ μΈμ¦ μμ μ μννλ νλμ¨μ΄ λλ μννΈμ¨μ΄ κ΅¬μ± μμμ λλ€. μμλ‘λ 보μ ν€, μ§λ¬Έ μΈμκΈ°, μλ©΄ μΈμ μμ€ν μ΄ μμ΅λλ€.
- κ³΅κ° ν€ μ격 μ¦λͺ (Public Key Credential): μ¬μ©μμ μΈμ¦μμ μ°κ²°λ μνΈν ν€ μ(κ³΅κ° ν€μ κ°μΈ ν€)μ λλ€. κ³΅κ° ν€λ μ λ’° λΉμ¬μμ μλ²μ μ μ₯λκ³ κ°μΈ ν€λ μ¬μ©μμ μΈμ¦μμ μμ νκ² μ μ₯λ©λλ€.
- μ¦λͺ (Attestation): μΈμ¦μκ° μμ μ μ νκ³Ό κΈ°λ₯μ λν μνΈν μλͺ μ 보λ₯Ό μ λ’° λΉμ¬μμκ² μ 곡νλ νλ‘μΈμ€μ λλ€. μ΄λ₯Ό ν΅ν΄ RPλ μΈμ¦μμ μ§μμ μ λ’°μ±μ νμΈν μ μμ΅λλ€.
- μ΄μ€μ (Assertion): μ¬μ©μμ μ μμ μ λ’° λΉμ¬μμκ² μ¦λͺ νκΈ° μν΄ μΈμ¦μκ° μμ±νλ μνΈν μλͺ λ λ¬Έμ₯μ λλ€. μ΄μ€μ μ μ¬μ©μμ κ³΅κ° ν€ μ격 μ¦λͺ κ³Ό μ°κ΄λ κ°μΈ ν€λ₯Ό κΈ°λ°μΌλ‘ ν©λλ€.
- μ¬μ©μ κ²μ¦(User Verification): μΈμ¦μκ° μΈμ¦ μμ μ μννκΈ° μ μ μ¬μ©μμ μ‘΄μ¬μ λμλ₯Ό νμΈνλ λ° μ¬μ©νλ λ°©λ²μ λλ€. μμλ‘λ μ§λ¬Έ μ€μΊ, PIN μ λ ₯, μλ©΄ μΈμμ΄ μμ΅λλ€.
- μ¬μ©μ μ‘΄μ¬ νμΈ(User Presence): μ¬μ©μκ° λ¬Όλ¦¬μ μΌλ‘ μ‘΄μ¬νλ©° μΈμ¦μμ μνΈ μμ©νκ³ μμμ μλ―Έν©λλ€(μ: 보μ ν€ ννκΈ°).
WebAuthn ꡬν: λ¨κ³λ³ κ°μ΄λ
WebAuthn ꡬνμλ λͺ κ°μ§ μ£Όμ λ¨κ³κ° ν¬ν¨λ©λλ€. λ€μμ νλ‘μΈμ€μ μΌλ°μ μΈ κ°μμ λλ€:
1. λ±λ‘ (μ격 μ¦λͺ μμ±)
μ λ’° λΉμ¬μμ μλ‘μ΄ μΈμ¦μλ₯Ό λ±λ‘νλ κ³Όμ μ λλ€.
- μ¬μ©μκ° λ±λ‘ μμ: μ¬μ©μκ° μΉμ¬μ΄νΈλ μ ν리μΌμ΄μ μμ λ±λ‘ μ μ°¨λ₯Ό μμν©λλ€.
- μ λ’° λΉμ¬μκ° μ±λ¦°μ§ μμ±: μ λ’° λΉμ¬μλ κ³ μ νκ³ μνΈνμ μΌλ‘ μμ ν μ±λ¦°μ§(μμμ λ°μ΄ν°)λ₯Ό μμ±νμ¬ μ¬μ©μ λΈλΌμ°μ λ‘ λ³΄λ λλ€. μ΄ μ±λ¦°μ§λ μ¬μ μ‘ κ³΅κ²©μ λ°©μ§νλ λ° λμμ΄ λ©λλ€. RPλ λν μΌλ°μ μΌλ‘ μΉμ¬μ΄νΈμ λλ©μΈ μ΄λ¦μΈ μ λ’° λΉμ¬μ ID(RP ID)μ κ°μ μ 보λ₯Ό μ 곡ν©λλ€.
- λΈλΌμ°μ κ° μΈμ¦μμ μ°κ²°: λΈλΌμ°μ λ WebAuthn APIλ₯Ό μ¬μ©νμ¬ μΈμ¦μμ μ°κ²°ν©λλ€. λΈλΌμ°μ λ RP ID, μ¬μ©μ ID, μ±λ¦°μ§λ₯Ό μ§μ ν©λλ€.
- μΈμ¦μκ° ν€ μ μμ±: μΈμ¦μλ μλ‘μ΄ κ³΅κ°/κ°μΈ ν€ μμ μμ±ν©λλ€. κ°μΈ ν€λ μΈμ¦μ μ체μ μμ νκ² μ μ₯λ©λλ€.
- μΈμ¦μκ° λ°μ΄ν° μλͺ : μΈμ¦μλ κ°μΈ ν€λ₯Ό μ¬μ©νμ¬ μ±λ¦°μ§(κ·Έλ¦¬κ³ λ€λ₯Έ λ°μ΄ν°μΌ μ μμ)μ μλͺ ν©λλ€. λν μΈμ¦μ μ체μ λν μ 보λ₯Ό μ 곡νλ μ¦λͺ λ¬Έμ₯μ μμ±ν©λλ€.
- λΈλΌμ°μ κ° λ°μ΄ν°λ₯Ό μ λ’° λΉμ¬μμκ² λ°ν: λΈλΌμ°μ λ κ³΅κ° ν€, μλͺ , μ¦λͺ λ¬Έμ₯μ μ λ’° λΉμ¬μμκ² λ°νν©λλ€.
- μ λ’° λΉμ¬μκ° λ°μ΄ν° κ²μ¦: μ λ’° λΉμ¬μλ κ³΅κ° ν€λ₯Ό μ¬μ©νμ¬ μλͺ μ νμΈνκ³ μ¦λͺ λ¬Έμ₯μ νμΈνμ¬ μΈμ¦μκ° μ λ’°ν μ μλμ§ νμΈν©λλ€.
- μ λ’° λΉμ¬μκ° κ³΅κ° ν€ μ μ₯: μ λ’° λΉμ¬μλ μ¬μ©μμ κ³μ κ³Ό μ°κ΄λ κ³΅κ° ν€λ₯Ό μ μ₯ν©λλ€.
μμ (κ°λ ):
μ¨λ¦¬μ€λΌλ μ¬μ©μκ° example.comμ μμ μ YubiKeyλ₯Ό λ±λ‘νκ³ μΆμ΄νλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. μλ²λ "A7x92BcDeF"μ κ°μ μμμ λ¬Έμμ΄μ μμ±νμ¬ μ¨λ¦¬μ€μ λΈλΌμ°μ λ‘ λ³΄λ λλ€. κ·Έλ¬λ©΄ λΈλΌμ°μ λ YubiKeyμκ² ν€ μμ μμ±νκ³ ν΄λΉ λ¬Έμμ΄μ μλͺ νλΌκ³ μ§μν©λλ€. YubiKeyλ μ΄λ₯Ό μννκ³ κ³΅κ° ν€, μλͺ λ λ¬Έμμ΄, κ·Έλ¦¬κ³ μμ μ λν μΌλΆ μ 보λ₯Ό λ°νν©λλ€. μλ²λ μλͺ μ΄ μ ν¨νκ³ YubiKeyκ° μ ν μ₯μΉμΈμ§ νμΈν ν μ¨λ¦¬μ€μ κ³μ κ³Ό μ°κ΄λ κ³΅κ° ν€λ₯Ό μ μ₯ν©λλ€.
2. μΈμ¦ (μ격 μ¦λͺ μ΄μ€μ )
λ±λ‘λ μΈμ¦μλ₯Ό μ¬μ©νμ¬ μ¬μ©μμ μ μμ νμΈνλ κ³Όμ μ λλ€.
- μ¬μ©μκ° λ‘κ·ΈμΈ μμ: μ¬μ©μκ° μΉμ¬μ΄νΈλ μ ν리μΌμ΄μ μμ λ‘κ·ΈμΈ μ μ°¨λ₯Ό μμν©λλ€.
- μ λ’° λΉμ¬μκ° μ±λ¦°μ§ μμ±: μ λ’° λΉμ¬μλ κ³ μ ν μ±λ¦°μ§λ₯Ό μμ±νμ¬ μ¬μ©μ λΈλΌμ°μ λ‘ λ³΄λ λλ€.
- λΈλΌμ°μ κ° μΈμ¦μμ μ°κ²°: λΈλΌμ°μ λ WebAuthn APIλ₯Ό μ¬μ©νμ¬ μ¬μ©μμ κ³μ κ³Ό μ°κ΄λ μΈμ¦μμ μ°κ²°ν©λλ€.
- μΈμ¦μκ° μ±λ¦°μ§ μλͺ : μΈμ¦μλ μ¬μ©μμκ² κ²μ¦(μ: μ§λ¬Έ, PIN)μ μμ²ν λ€μ κ°μΈ ν€λ₯Ό μ¬μ©νμ¬ μ±λ¦°μ§μ μλͺ ν©λλ€.
- λΈλΌμ°μ κ° λ°μ΄ν°λ₯Ό μ λ’° λΉμ¬μμκ² λ°ν: λΈλΌμ°μ λ μλͺ μ μ λ’° λΉμ¬μμκ² λ°νν©λλ€.
- μ λ’° λΉμ¬μκ° μλͺ κ²μ¦: μ λ’° λΉμ¬μλ μ μ₯λ κ³΅κ° ν€λ₯Ό μ¬μ©νμ¬ μλͺ μ νμΈν©λλ€. μλͺ μ΄ μ ν¨νλ©΄ μ¬μ©μλ μΈμ¦λ©λλ€.
μμ (κ°λ ):
μ¨λ¦¬μ€κ° λ‘κ·ΈμΈνκΈ° μν΄ example.comμΌλ‘ λμμ΅λλ€. μλ²λ "G1h34IjKlM"κ³Ό κ°μ λ λ€λ₯Έ μμμ λ¬Έμμ΄μ μμ±νμ¬ μ¨λ¦¬μ€μ λΈλΌμ°μ λ‘ λ³΄λ λλ€. λΈλΌμ°μ λ μ¨λ¦¬μ€μκ² YubiKeyλ₯Ό ν°μΉνλΌκ³ μμ²ν©λλ€. YubiKeyλ μ¨λ¦¬μ€μ μ‘΄μ¬λ₯Ό νμΈν ν μ λ¬Έμμ΄μ μλͺ ν©λλ€. μλͺ μ μλ²λ‘ λ€μ μ μ‘λκ³ , μλ²λ λ±λ‘ μ€μ μ μ₯ν κ³΅κ° ν€λ₯Ό μ¬μ©νμ¬ μ΄λ₯Ό νμΈν©λλ€. μλͺ μ΄ μΌμΉνλ©΄ μ¨λ¦¬μ€λ λ‘κ·ΈμΈλ©λλ€.
μ½λ μμ (κ°μνλ JavaScript - μλ² μΈ‘ νμ)
μ΄κ²μ κ°μνλ μμ μ΄λ©° μ±λ¦°μ§ μμ±, μλͺ κ²μ¦ λ° μ¬μ©μ κ³μ κ΄λ¦¬λ₯Ό μν μλ² μΈ‘ λ‘μ§μ΄ νμν©λλ€. κ΄λ ¨λ κΈ°λ³Έ λ¨κ³λ₯Ό μ€λͺ νκΈ° μν κ²μ λλ€.
// λ±λ‘ (κ°μν)
async function register() {
try {
const options = await fetch('/registration/options').then(res => res.json()); // μλ²μμ μ΅μ
κ°μ Έμ€κΈ°
const credential = await navigator.credentials.create(options);
const response = await fetch('/registration/complete', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
credential: {
id: credential.id,
rawId: btoa(String.fromCharCode(...new Uint8Array(credential.rawId))),
type: credential.type,
response: {
attestationObject: btoa(String.fromCharCode(...new Uint8Array(credential.response.attestationObject))),
clientDataJSON: btoa(String.fromCharCode(...new Uint8Array(credential.response.clientDataJSON))),
}
}
})
});
const result = await response.json();
if (result.success) {
alert('λ±λ‘ μ±κ³΅!');
} else {
alert('λ±λ‘ μ€ν¨: ' + result.error);
}
} catch (error) {
console.error('λ±λ‘ μ€ μ€λ₯ λ°μ:', error);
alert('λ±λ‘ μ€ν¨: ' + error.message);
}
}
// μΈμ¦ (κ°μν)
async function authenticate() {
try {
const options = await fetch('/authentication/options').then(res => res.json()); // μλ²μμ μ΅μ
κ°μ Έμ€κΈ°
const credential = await navigator.credentials.get(options);
const response = await fetch('/authentication/complete', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
credential: {
id: credential.id,
rawId: btoa(String.fromCharCode(...new Uint8Array(credential.rawId))),
type: credential.type,
response: {
authenticatorData: btoa(String.fromCharCode(...new Uint8Array(credential.response.authenticatorData))),
clientDataJSON: btoa(String.fromCharCode(...new Uint8Array(credential.response.clientDataJSON))),
signature: btoa(String.fromCharCode(...new Uint8Array(credential.response.signature))),
userHandle: credential.response.userHandle ? btoa(String.fromCharCode(...new Uint8Array(credential.response.userHandle))) : null
}
}
})
});
const result = await response.json();
if (result.success) {
alert('μΈμ¦ μ±κ³΅!');
} else {
alert('μΈμ¦ μ€ν¨: ' + result.error);
}
} catch (error) {
console.error('μΈμ¦ μ€ μ€λ₯ λ°μ:', error);
alert('μΈμ¦ μ€ν¨: ' + error.message);
}
}
μ€μ μ°Έκ³ μ¬ν:
- μλ² μΈ‘ λ‘μ§: JavaScript μ½λλ μ±λ¦°μ§ μμ±, μλͺ κ²μ¦ λ° μ¬μ©μ κ³μ κ΄λ¦¬λ₯Ό μν΄ μλ² μΈ‘ κ΅¬μ± μμμ ν¬κ² μμ‘΄ν©λλ€. Node.js, Python, Java λλ PHPμ κ°μ μλ² μΈ‘ μΈμ΄λ₯Ό μ¬μ©νμ¬ μ΄λ¬ν κ΅¬μ± μμλ₯Ό ꡬνν΄μΌ ν©λλ€.
- μ€λ₯ μ²λ¦¬: μ½λμλ κΈ°λ³Έμ μΈ μ€λ₯ μ²λ¦¬κ° ν¬ν¨λμ΄ μμ§λ§, νλ‘λμ νκ²½μμλ λ κ°λ ₯ν μ€λ₯ μ²λ¦¬λ₯Ό ꡬνν΄μΌ ν©λλ€.
- 보μ κ³ λ € μ¬ν: νμ μλ² μΈ‘μμ μνΈν μμ κ³Ό λ―Όκ°ν λ°μ΄ν°λ₯Ό μμ νκ² μ²λ¦¬νμμμ€. μ¬μ μ‘ κ³΅κ²© λ° ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) 곡격과 κ°μ μ·¨μ½μ μΌλ‘λΆν° 보νΈνκΈ° μν΄ λ³΄μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μμμ€.
- Base64 μΈμ½λ©: `btoa()` ν¨μλ μλ²λ‘ μ μ‘νκΈ° μν΄ μ΄μ§ λ°μ΄ν°λ₯Ό Base64 λ¬Έμμ΄λ‘ μΈμ½λ©νλ λ° μ¬μ©λ©λλ€.
μ¬λ°λ₯Έ μΈμ¦μ μ ννκΈ°
WebAuthnμ λ€μν μ νμ μΈμ¦μλ₯Ό μ§μνλ©°, κ°κ° κ³ μ ν μ₯λ¨μ μ΄ μμ΅λλ€. μ ν리μΌμ΄μ μ μ ν©ν μΈμ¦μλ₯Ό μ νν λ λ€μ μμλ₯Ό κ³ λ €νμμμ€:
- 보μ μμ€: μΌλΆ μΈμ¦μλ λ€λ₯Έ μΈμ¦μλ³΄λ€ λ λμ μμ€μ 보μμ μ 곡ν©λλ€. μλ₯Ό λ€μ΄, νλμ¨μ΄ 보μ ν€λ μΌλ°μ μΌλ‘ μννΈμ¨μ΄ κΈ°λ° μΈμ¦μλ³΄λ€ λ μμ ν κ²μΌλ‘ κ°μ£Όλ©λλ€.
- μ¬μ©μ κ²½ν: μ¬μ©μ κ²½νμ μΈμ¦μμ λ°λΌ ν¬κ² λ¬λΌμ§ μ μμ΅λλ€. μ체 μΈμ¦μλ μννκ³ νΈλ¦¬ν κ²½νμ μ 곡νλ λ°λ©΄, 보μ ν€λ μ¬μ©μκ° μΆκ° μ₯μΉλ₯Ό ν΄λν΄μΌ ν μ μμ΅λλ€.
- λΉμ©: μΈμ¦μ λΉμ©λ λ€μν μ μμ΅λλ€. νλμ¨μ΄ 보μ ν€λ λΉκ΅μ λΉμ μ μμ§λ§ μννΈμ¨μ΄ κΈ°λ° μΈμ¦μλ μ’ μ’ λ¬΄λ£μ λλ€.
- νλ«νΌ νΈνμ±: μ νν μΈμ¦μκ° λμ κ³ κ°μ΄ μ¬μ©νλ νλ«νΌ λ° μ₯μΉμ νΈνλλμ§ νμΈνμμμ€.
λ€μμ μΌλ°μ μΈ μ νμ μΈμ¦μμ λλ€:
- νλμ¨μ΄ 보μ ν€: YubiKey λ° Titan 보μ ν€μ κ°μ΄ USB λλ NFCλ₯Ό ν΅ν΄ μ»΄ν¨ν°λ λͺ¨λ°μΌ μ₯μΉμ μ°κ²°λλ 물리μ μ₯μΉμ λλ€. λμ μμ€μ 보μμ μ 곡νλ©° νΌμ± 곡격μ κ°ν©λλ€. λμ 보μμ΄ μꡬλλ μ ν리μΌμ΄μ λ° κΈ°μ νκ²½μμ λ리 μ¬μ©λ©λλ€.
- νλ«νΌ μΈμ¦μ: μ΄μ 체μ λ° μ₯μΉμ λ΄μ₯λ μΈμ¦μμ λλ€. μμλ‘λ Windows Hello(μ§λ¬Έ, μΌκ΅΄ μΈμ) λ° macOSμ Touch IDκ° μμ΅λλ€. νΈλ¦¬νκ³ μμ ν μΈμ¦ κ²½νμ μ 곡ν©λλ€.
- λͺ¨λ°μΌ μΈμ¦μ: μΌλΆ λͺ¨λ°μΌ μ±μ WebAuthn μΈμ¦μ μν μ ν μ μμ΅λλ€. μ΄λ€μ μ’ μ’ μ체 μΈμ¦(μ§λ¬Έ λλ μλ©΄ μΈμ)μ νμ©νλ©° μ£Όλ‘ λͺ¨λ°μΌ μ₯μΉμμ μλΉμ€μ μ‘μΈμ€νλ μ¬μ©μμκ² νΈλ¦¬ν©λλ€.
WebAuthn ꡬνμ μν λͺ¨λ² μ¬λ‘
μμ νκ³ μ¬μ©μ μΉνμ μΈ WebAuthn ꡬνμ 보μ₯νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μμμ€:
- μ λ’°ν μ μλ λΌμ΄λΈλ¬λ¦¬ μ¬μ©: ꡬν νλ‘μΈμ€λ₯Ό λ¨μννκ³ μΌλ°μ μΈ ν¨μ μ νΌνκΈ° μν΄ μ κ΄λ¦¬λκ³ μ λ’°ν μ μλ WebAuthn λΌμ΄λΈλ¬λ¦¬ λλ SDK μ¬μ©μ κ³ λ €νμμμ€. Node.js, Python, Java λ± λ€μν μλ² μΈ‘ μΈμ΄μ μ¬μ©ν μ μλ λΌμ΄λΈλ¬λ¦¬κ° μμ΅λλ€.
- κ°λ ₯ν μ€λ₯ μ²λ¦¬ ꡬν: μ€λ₯λ₯Ό μ μμ μΌλ‘ μ²λ¦¬νκ³ μ¬μ©μμκ² μ μ΅ν μ€λ₯ λ©μμ§λ₯Ό μ 곡νμμμ€. λλ²κΉ λͺ©μ μΌλ‘ μ€λ₯λ₯Ό κΈ°λ‘νμμμ€.
- μ¬μ μ‘ κ³΅κ²© λ°©μ§: μ¬μ μ‘ κ³΅κ²©μ λ°©μ§νκΈ° μν΄ κ³ μ νκ³ μνΈνμ μΌλ‘ μμ ν μ±λ¦°μ§λ₯Ό μ¬μ©νμμμ€.
- μ¦λͺ λ¬Έμ₯ κ²μ¦: μΈμ¦μμ μ§μμ μ λ’°μ±μ 보μ₯νκΈ° μν΄ μ¦λͺ λ¬Έμ₯μ νμΈνμμμ€.
- κ³΅κ° ν€ μμ νκ² μ μ₯: μλ²μ κ³΅κ° ν€λ₯Ό μμ νκ² μ μ₯νκ³ λ¬΄λ¨ μ‘μΈμ€λ‘λΆν° 보νΈνμμμ€.
- μ¬μ©μ κ΅μ‘: WebAuthn μΈμ¦μλ₯Ό λ±λ‘νκ³ μ¬μ©νλ λ°©λ²μ λν΄ λͺ ννκ³ κ°κ²°ν μ§μΉ¨μ μ¬μ©μμκ² μ 곡νμμμ€.
- λ°±μ μ΅μ μ 곡: μ¬μ©μκ° κΈ°λ³Έ μΈμ¦μμ λν μ‘μΈμ€ κΆνμ μμ κ²½μ°λ₯Ό λλΉνμ¬ λ체 μΈμ¦ λ°©λ²(μ: 볡ꡬ μ½λ, 보μ μ§λ¬Έ)μ μ 곡νμμμ€. μ΄λ μ κ·Όμ±μ μ μ§νκ³ κ³μ μ κΈμ λ°©μ§νλ λ° μ€μν©λλ€. SMS λλ μ΄λ©μΌμ ν΅ν΄ μ μ‘λλ μΌνμ© λΉλ°λ²νΈλ₯Ό λ°±μ μ΅μ μΌλ‘ κ³ λ €ν μ μμ§λ§, WebAuthnμ λΉν΄ μ΄λ¬ν λ°©λ²μ 보μ νκ³λ₯Ό μΈμ§ν΄μΌ ν©λλ€.
- μ κΈ°μ μΈ κ²ν λ° μ λ°μ΄νΈ: μ΅μ WebAuthn μ¬μ λ° λ³΄μ λͺ¨λ² μ¬λ‘μ λν μ΅μ μ 보λ₯Ό μ μ§νμμμ€. μ κΈ°μ μΌλ‘ ꡬνμ κ²ν νκ³ μ λ°μ΄νΈνμ¬ μ·¨μ½μ μ ν΄κ²°νκ±°λ 보μμ κ°μ νμμμ€.
- μ κ·Όμ± κ³ λ €: WebAuthn ꡬνμ΄ μ₯μ κ° μλ μ¬μ©μμκ²λ μ κ·Ό κ°λ₯νλλ‘ νμμμ€. λ체 μ λ ₯ λ°©λ²μ μ 곡νκ³ μΈμ¦ νλ‘μΈμ€κ° 보쑰 κΈ°μ κ³Ό νΈνλλλ‘ νμμμ€.
κΈλ‘λ² μ»¨ν μ€νΈμμμ WebAuthn
κΈλ‘λ² κ³ κ°μ μν΄ WebAuthnμ ꡬνν λ λ€μμ κ³ λ €νμμμ€:
- μΈμ΄ μ§μ: μΉμ¬μ΄νΈλ μ ν리μΌμ΄μ μ΄ μ¬λ¬ μΈμ΄λ₯Ό μ§μνκ³ WebAuthn μΈμ¦ νλ‘μΈμ€κ° λ€λ₯Έ μ§μμ λ§κ² νμ§νλμλμ§ νμΈνμμμ€.
- λ¬Ένμ κ³ λ € μ¬ν: μΈμ¦ μ νΈλ λ° λ³΄μ μΈμμ λν λ¬Ένμ μ°¨μ΄λ₯Ό μ λ νμμμ€. μΌλΆ λ¬ΈνκΆμμλ λ€λ₯Έ μ νλ³΄λ€ νΉμ μ νμ μΈμ¦μλ₯Ό λ νΈμνκ² μ¬κΈΈ μ μμ΅λλ€.
- μ§μ κ·μ : μΈμ¦ λ° λ°μ΄ν° 보μκ³Ό κ΄λ ¨λ μ§μ κ·μ λλ κ·μ μ€μ μꡬ μ¬νμ μμ§νμμμ€.
- μΈμ¦μ κ°μ©μ±: λ€λ₯Έ μ§μμμ λ€μν μ νμ μΈμ¦μ κ°μ©μ±μ κ³ λ €νμμμ€. μΌλΆ μΈμ¦μλ νΉμ κ΅κ°μμ μ½κ² ꡬν μ μκ±°λ μ§μλμ§ μμ μ μμ΅λλ€. μλ₯Ό λ€μ΄, 보μ ν€λ λΆλ―Έμ μ λ½μμ λ리 μ¬μ©λμ§λ§ μΌλΆ κ°λ°λμκ΅μμλ κ°μ©μ±μ΄ μ νλ μ μμ΅λλ€.
- κ²°μ λ°©λ²: νλμ¨μ΄ 보μ ν€λ₯Ό νλ§€νλ κ²½μ° λ€λ₯Έ μ§μμμ λ리 ν΅μ©λλ κ²°μ λ°©λ²μ μ 곡νλμ§ νμΈνμμμ€.
λΉλ°λ²νΈ μλ μΈμ¦μ λ―Έλ
WebAuthnμ λΉλ°λ²νΈμ λν μμ νκ³ μ¬μ©μ μΉνμ μΈ λμμΌλ‘ λΉ λ₯΄κ² μ±νλκ³ μμ΅λλ€. λ λ§μ λΈλΌμ°μ μ νλ«νΌμ΄ WebAuthnμ μ§μν¨μ λ°λΌ λΉλ°λ²νΈ μλ μΈμ¦μ μ¨λΌμΈ 보μμ μλ‘μ΄ νμ€μ΄ λ κ²μ λλ€. WebAuthnμ μμ©ν μ‘°μ§μ 보μ νμΈλ₯Ό κ°ννκ³ μ¬μ©μ κ²½νμ κ°μ νλ©° μ§μ λΉμ©μ μ κ°ν μ μμ΅λλ€.
FIDO μΌλΌμ΄μΈμ€λ WebAuthn λ° κΈ°ν FIDO νμ€μ μ§μμ μΌλ‘ κ°λ°νκ³ ν보νμ¬ νμ μ μ£Όλνκ³ μνΈ μ΄μ©μ±μ κ°μ νκ³ μμ΅λλ€. ν₯ν λ°μ μλ λ€μμ΄ ν¬ν¨λ μ μμ΅λλ€:
- μ¬μ©μ κ²½ν κ°μ : μΈμ¦ νλ‘μΈμ€λ₯Ό λμ± κ°μννκ³ μ¬μ©μμκ² λμ± μννκ² λ§λλλ€.
- 보μ κ°ν: μλ‘μ΄ μνμΌλ‘λΆν° 보νΈνκΈ° μν μλ‘μ΄ λ³΄μ μ‘°μΉλ₯Ό κ°λ°ν©λλ€.
- λ λμ μ±ν: IoT μ₯μΉ λ° λͺ¨λ°μΌ μ ν리μΌμ΄μ μ ν¬ν¨ν λ λ§μ μ₯μΉ λ° νλ«νΌμΌλ‘ WebAuthn μ§μμ νμ₯ν©λλ€.
- λΆμ° μ μκ³Όμ ν΅ν©: μ¬μ©μκ° κ°μΈ λ°μ΄ν° λ° μ¨λΌμΈ μ μμ λ μ μ μ΄ν μ μλλ‘ WebAuthnκ³Ό λΆμ° μ μ μ루μ μ ν΅ν©μ νμν©λλ€.
κ²°λ‘
Web Authentication API(WebAuthn)λ λΉλ°λ²νΈ μλ λ‘κ·ΈμΈ κ΅¬νμ μν κ°λ ₯νκ³ μμ ν μ루μ μ μ 곡ν©λλ€. κ³΅κ° ν€ μνΈν λ° μ΅μ μΈμ¦ λ°©λ²μ νμ©νμ¬ WebAuthnμ λΉλ°λ²νΈλ₯Ό μ κ±°νκ³ λΉλ°λ²νΈ κ΄λ ¨ 곡격μ μνμ μ€μ΄λ©° μ¬μ©μ κ²½νμ κ°μ ν©λλ€. WebAuthnμ ꡬννλ κ²μ μΉμ¬μ΄νΈλ μ ν리μΌμ΄μ μ 보μμ κ°ννκ³ μ¬μ©μμκ² λ νΈλ¦¬νκ³ μμ ν μΈμ¦ κ²½νμ μ 곡νλ μ€μν λ¨κ³κ° λ μ μμ΅λλ€. μν νκ²½μ΄ κ³μ μ§νν¨μ λ°λΌ WebAuthnμ ν΅ν λΉλ°λ²νΈ μλ μΈμ¦μ μμ©νλ κ²μ μ¨λΌμΈ 보μμ λ―Έλμ λν μ€μν ν¬μμ λλ€.