Server Ip Ranges
Kotlin library for cloud IP identification and restriction
TL;DR
- ν΄λΌμ°λ μ 곡μ(AWS, GCP, Azure λ±)μ IP λμμ μλ³νκ³ μ κ·Ό μ νμ νμ©ν μ μλ Kotlin λΌμ΄λΈλ¬λ¦¬μ λλ€.
- κ³΅κ° API μ΄λ·°μ§ λ°©μ§λ₯Ό μν΄ ν΄λΌμ°λ λμ κΈ°λ° μ°¨λ¨μ΄ νμνλ κ²½νμ λ°νμΌλ‘, μ΅μ νλ IP λμ λ°μκ³Ό κ²μ¦ μ±λ₯ μ΅μ νλ₯Ό λͺ©νλ‘ μ€κ³νμμ΅λλ€.
- IP λμ μμ§Β·μ μ₯ νμ΄νλΌμΈκ³Ό λ©λͺ¨λ¦¬ λ΄ κ²μ¦ μμ§μΌλ‘ ꡬμ±λλ©°, Spring Boot λ± κΈ°μ‘΄ JVM μλΉμ€μ λΌμ΄λΈλ¬λ¦¬ ννλ‘ κ°νΈν ν΅ν©ν μ μμ΅λλ€.
- μ¬λ΄ μλΉμ€ λμ κ²½νμ ν λλ‘ μ€ν μμ€λ‘ 곡κ°νμμ΅λλ€.
κΈ°ν
λ°°κ²½
μ΄ νλ‘μ νΈλ μ¬λ΄μμ μ΄μνλ κ³΅κ° API μλΉμ€μ μ΄λ·°μ§ λ°©μ§λ₯Ό μν΄ κ΅¬μΆνλ IP μ°¨λ¨ μμ€ν μ λͺ¨νλ‘ μμλμμ΅λλ€.
ν΄λΉ μλΉμ€λ μ£Όμ ν¬νΈ κ²μ κ²°κ³Όμ λΉνΈμΈ ννλ‘ μ 곡λμ΄ λ°μ΄ν° μ‘°νλ₯Ό μ 곡ν΄μ£Όλ μλΉμ€λ‘, μΌκ° 30λ§ κ±΄ μ΄μμ νΈλν½μ μ²λ¦¬νκ³ μμμ΅λλ€.
λꡬλ μ κ·Ό κ°λ₯ν κ³΅κ° μλΉμ€μ νΉμ± μ, λ§€ν¬λ‘μ μ€ν¬λν λ±μ λ€μν λ°©μμ λμν λκ·λͺ¨ μ΄λ·°μ§ νΈλν½μ νΌν μ μμμ΅λλ€. μ΄λ μλΉμ€ μ§ν μ곑μ λμ΄ μλΉμ€μ μ°κ²°λ μ½μ΄ μλΉμ€μλ μν₯μ μ£ΌμκΈ°μ μ΄μ μμ μ±μ ν° μνμ΄ λμμ΅λλ€.
μ΄κΈ°μλ IPλ³ Rate Limitingμ λμ νμ¬ λμνμΌλ ν΄λΌμ°λ νκ²½μ μ λ IPλ₯Ό μ΄μ©ν IP λ‘ν μ΄μ μλ λμν μ μμμ΅λλ€. κ²°κ΅ ν΄λΌμ°λ μ°ν 곡격μ μμ² μ°¨λ¨μ μν΄ ν΄λΌμ°λ λμ μ체λ₯Ό μ λ³ν μ μλ μλ¨μ κ°λ°ν΄μΌ νμ΅λλ€.
λͺ©ν
1. μ΅μ νλ IP λμ μ 곡
ν΄λΌμ°λ μ 곡μλ λ€νΈμν¬μ μλΉμ€ μν©μ λ°λΌ μμλ‘ IP λμμ λ³κ²½ν©λλ€. μ€λ IP λμμ λͺ¨λ μ°¨λ¨νλ€ νλλΌλ, λ΄μΌμ΄λ©΄ μλ‘μ΄ λμμμ μ΄λ·°μ§ 곡격μ λ°μ μ μμ΅λλ€.
λ³μΉμ μΈ μ΄λ·°μ§μ μμ² μ°¨λ¨μ μν΄μλ ν΄λΌμ°λ μ 곡μμ IP λμ μ λ°μ΄νΈλ₯Ό μ€μκ°μΌλ‘ λ°μν μ μμ΄μΌ νμ΅λλ€.
2. CPU / λ©λͺ¨λ¦¬ μ±λ₯ μ΅μ ν
ν΄λΌμ°λ μ 곡μλ μ μΈκ³μ κ±Έμ³ μλ§μ μΈνλΌλ₯Ό μ΄μνκ³ μμ΅λλ€. λ§€λ² μ΄ λͺ¨λ μλ²μ μλ§μ IP λμμ μ λΆ κ°μ Έμ λ©λͺ¨λ¦¬μ μ μ¬νλ€λ©΄ κ·Έκ² μμ²΄λ‘ μλ²μ ν° λΆνκ° λ©λλ€.
λν, κ²μ¦ν IPκ° λ€μ΄μ¬ λλ§λ€ λͺ¨λ ν보ꡰμ μΌμΌν λμ νλ€λ©΄ λμ νΈλν½μ μ²λ¦¬νλ νκ²½μμ λμ λ μ΄ν΄μλ₯Ό μμν μ μμ΅λλ€.
μ λ¬Έμ λ€μ ν΄κ²°νκΈ° μνμ¬ IP λ°μ΄ν°λ₯Ό μ¬μ© μ¬λ‘μ λ§κ² κ²½λννκ³ , κ²μ¦ μλλ₯Ό λμΌ μ μλλ‘ λ°μ΄ν° ꡬ쑰λ₯Ό μ΅μ νν νμκ° μμμ΅λλ€.
3. κΈ°μ‘΄ μλΉμ€μμ κ°νΈν ν΅ν©
λ³Έ νλ‘μ νΈκ° λͺ©ννλ κΈ°λ₯μ βνΉμ IPκ° ν΄λΌμ°λ λμμΈμ§ κ²μ¦νλ Bool ν¨μβ μ λλ‘ μμ½ν μ μμκΈ°μ, λ³λμ μλ²λ₯Ό ꡬμΆνλ κ²μ μ€λ² μμ§λμ΄λ§μ΄λΌκ³ νλ¨νμ΅λλ€.
μ΅μνλ κ°λ¨ν μΈν°νμ΄μ€λ₯Ό μ 곡νλ λμμ Spring Bootλ‘ κ΅¬μ±λ κΈ°μ‘΄ κΈ°μ μ€νκ³Ό λΉ λ₯΄κ² ν΅ν©λ μ μμ΄μΌ νκΈ°μ μ΄λ₯Ό λͺ¨λ λ§μ‘±νλ λΌμ΄λΈλ¬λ¦¬ ννλ₯Ό μ±ννμ΅λλ€.
κ°λ°
κΈ°μ μ€ν
λ³Έ νλ‘μ νΈλ μλμ κ°μ μ₯μ λ€μ μ΄μ λ‘ KotlinμΌλ‘ μμ±νμ΅λλ€.
- κΈ°μ‘΄
JVM-SpringκΈ°λ° μλΉμ€μμ 100% νΈν - Kotlin-first
Kotlin+Springνκ²½ μ§μ - μΈλΆ API / νμΌ IO μ²λ¦¬ μ Null νμ μμ μ±
kotlinx.serializationνμ© μ§λ ¬ν μ²λ¦¬- κ°κ²°ν λ¬Έλ²μ ν΅ν λ‘μ§ κ°λ μ±
- νμ₯ μ μ½λ£¨ν΄ λΉλκΈ° μ²λ¦¬ μ©μ΄
μν€ν μ²
λ³Έ νλ‘μ νΈμ μν€ν μ²λ ν¬κ² ν΄λΌμ°λ μ 곡μμ IP λμμ μμ§νμ¬ μ μ₯νλ λΆλΆκ³Ό μ μ₯ν IP λμμ λΆλ¬μμ κ²μ¦νλ λΆλΆ λ κ°μ§λ‘ λλ©λλ€.
ν΄λΌμ°λ IP λμ μμ§

ν΄λΌμ°λ μ 곡μκ° κ³΅κ°νλ CIDR νμμ IP λμ λ°μ΄ν°λ₯Ό νμ±νμ¬ μ¬μ μ μλ λΆλ₯ κ·μΉ(Provider, Region)μ λ§κ² μ μ ν©λλ€.
μ΄ν, κ²μ¦μ μ¬μ©ν μ μλλ‘ CIDRμ μ κ·μμΌλ‘ λ³ννμ¬ JSON νμΌμ ννλ‘ μ μ₯ν©λλ€. κ²μ¦ μ, λΌμ΄λΈλ¬λ¦¬λ λ³Έ νμΌμ μ μ₯λ μ κ·μμ μ½μ΄ IPλ₯Ό κ²μ¦νκ² λ©λλ€.
λ°±μ λ° μ΄λ ₯ κΈ°λ‘μ μνμ¬ μ μ λ CIDR λ°μ΄ν° μλ³Έλ JSON ννλ‘ μ μ₯ν©λλ€.
IP λμ κ²μ¦

μ¬μ©μ μ
μ₯μμ νμν κΈ°λ₯μ΄ λ¨μν λ§νΌ, 볡μ‘ν ꡬνμ μΆμννμ¬ μ΅μνμ μΈν°νμ΄μ€λ₯Ό μ 곡νμμ΅λλ€. μ¬μ©μλ isServerIP ν¨μλ§ νΈμΆνμ¬ IPκ° ν΄λΌμ°λ λμμΈμ§ κ²μ¦ν μ μμ΅λλ€. λν, Provider, Region νλΌλ―Έν°λ₯Ό μ λ¬νμ¬ κ²μ¦ 쑰건μ λΆμ¬ν μ μμ΅λλ€.
μ¬μ©μκ° IP κ²μ¦μ μμ²νλ©΄, λΌμ΄λΈλ¬λ¦¬λ λ‘컬μ μ μ₯λ Map νμμ Providerλ³ μ κ·μ μΊμλ₯Ό λ¨Όμ νμΈν©λλ€.
μΊμκ° μ‘΄μ¬ν μ Providerλ³ μ κ·μ λͺ©λ‘μ λ°ννκ³ , λΌμ΄λΈλ¬λ¦¬λ λμ μ κ·μ μ€ μΌμΉνλ λμμ΄ μλμ§ κ²μ¦νμ¬ κ²°κ³Όλ₯Ό μλ΅ν©λλ€. λμ λ¨μλ‘ ν¬ν¨ μ¬λΆλ₯Ό νμΈν΄μΌ νλ―λ‘ μ 체 λͺ©λ‘μ λν κ²μ¬κ° μ§νλ©λλ€.
μΊμκ° μ‘΄μ¬νμ§ μμ μ JSON νμΌμ μ μ₯λ Providerμ μ κ·μλ€μ μ½μ΄μ μΊμμ μ μ¬ν©λλ€.
νΈλ¬λΈ μν
1. λμ λ°μ΄ν° μ μ₯ λ°©μ
ν΄λΌμ°λλ λμ λμμ IPλ₯Ό μ§μν©λλ€. κ·Έλ κΈ°μ λμμ λμνλ λͺ¨λ IPλ₯Ό μΌμΌν StringμΌλ‘ μ μ₯νκ³ λΆλ¬μ¨λ€λ©΄ 곡κ°μ κ³Όνκ² μ°¨μ§νλ κ²μ λ¬Όλ‘ , κ²μ¦ μλλ λ§€μ° λλ €μ§λ μν©μ μμν μ μμμ΅λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ μ μ 곡κ°μ μ°¨μ§νλλ‘ λμμ μμΆν μ μμ΄μΌ νμ΅λλ€.
ν΄λΌμ°λ μ 곡μλ€μ λμμ λνλ΄λ CIDR νμμΌλ‘ 곡κ°ν©λλ€. μ¬κΈ°μμ μ°©μνμ¬ CIDRμ μ κ·μμΌλ‘ λ³ννλ λ°©μμ λ μ¬λ¦¬κ² λμμ΅λλ€. μ κ·μμ μ¬μ©ν κ²½μ°, μ 체 λμ λ°μ΄ν°λ₯Ό ν μ€μ λ¬Έμμ΄λ‘ 99.97% μ΄μ μμΆν μ μμΌλ©° ν λ²μ μ°μ°μΌλ‘ IPκ° λμμ ν¬ν¨λλμ§ κ²μ¦ν μ μμ΅λλ€.
2. μ»΄ν¨ν μμ κ΄λ¦¬
κ·Έλ¬λ, μ무리 λμμ μμΆνλλΌλ μ¬λ¬ ν΄λΌμ°λλ€μ λμ λ°μ΄ν°λ₯Ό λͺ¨λ λ©λͺ¨λ¦¬μ μ¬λ¦°λ€λ©΄ κ²°μ½ μ μ§ μμ μ©λμ μ°¨μ§νκ² λ©λλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄, λμ μ κ·μ νμΌμ λμ€ν¬μ μ μ₯νκ³ νμν λλ§ μ½μ΄μ€λ μ§μ° λ‘λ© λ°©μμ μ±ννμμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬μ λͺ¨λ μ κ·μ λ°μ΄ν°λ₯Ό κ°μ§κ³ μμ νμ μμ΄ νμν λΆλΆλ§ μ½μ΄μ λ‘λ©ν μ μκ² λ©λλ€. λν, μ κ·μ λ°μ΄ν°κ° μΈμ€ν΄μ€μ μ€νκ³Ό λ 립μ μΌλ‘ μ μ₯λκΈ°μ μΈμ€ν΄μ€λ₯Ό μ¬μμν λλ§λ€ λ¬΄κ±°μ΄ μ κ·μ λ°μ΄ν° μμ±μ μ§νν νμκ° μμ΄μ§λλ€.
νμ§λ§ λ¨μ μ§μ° λ‘λ©μΌλ‘λ§ κ΅¬ννλ€λ©΄, λ§μ λμ€ν¬ I/Oκ° λ°μνκΈ°μ λ§μ νΈλν½μ΄ λ°μνλ νκ²½μμλ μλ²μ λ§μ λΆλ΄μ μ£Όκ³ , λμ λ μ΄ν΄μλ₯Ό μμν μ μμμ΅λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬μ μΊμ±ν νμκ° μμμ΅λλ€.
κ·Έλ λ€λ©΄ μ΄λ€ κΈ°μ€μΌλ‘ λ°μ΄ν°λ₯Ό μΊμ±ν΄μΌ ν κΉμ?
κ°λ³ λμμ μΊμ±ν μλ μμμ΅λλ€. ν΄λΌμ°λ μλ²μ IPλ Region ν λΉ λμ λ΄μμ μμΈ‘ν μ μμ΄ λ°λκΈ° λλ¬Έμ 곡격μκ° λ€λ₯Έ λμμΌλ‘ λ°κΎΈμ΄ μμ²νλ€λ©΄ μΊμ±λ λμμ μλ―Έκ° μμ΄μ§λλ€.
κ·Έλ λ€κ³ Regionμ κΈ°μ€μΌλ‘ μ νμ μΈ μΊμ±μ ν μλ μμμ΅λλ€. λλΆλΆμ μ¬μ© μ¬λ‘μ κ²½μ°, νΈλν½μ Region μ§μ μ λν μμκ° μκ±°λ μμΈ‘ λΆκ°λ₯νκΈ° λλ¬Έμ λλ€.
κ·Έλ κΈ°μ μ΅μ’ μ μΌλ‘ Provider λ¨μ μΊμ±μ μ ννμμ΅λλ€. κ° Providerμ λν κ²μ¦ μμ² μ, μ΅μ΄μλ§ λμ€ν¬μμ μ½μ΄ λ©λͺ¨λ¦¬μ μ μ¬νκ³ μ΄νμλ μΊμλ λ°μ΄ν°λ₯Ό μ¬μ©ν©λλ€. μ΄λ₯Ό ν΅ν΄ Providerλ₯Ό μ§μ νμ¬ κ²μ¦ν κ²½μ°μ λμ€ν¬ I/Oλ₯Ό 1νλ‘ μ ννμ΅λλ€.
Providerλ₯Ό μ§μ νμ§ μμ κ²μ¦ μμ²μΈ κ²½μ°, κ²°κ΅ λͺ¨λ Providerμ λμμ λν κ²μ¦μ΄ νμν΄ λͺ¨λ Provider λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬μ μΊμ±ν©λλ€. μ΄λ¬ν κ²½μ° μ§μ° λ‘λ©μ λ©λͺ¨λ¦¬ μ κ°μ΄ μ νμ μ΄κΈ° λλ¬Έμ, λ¨Όμ μ 체 κ²μ¦μΌλ‘ μ΄μν λ€ κ²μ¦ ν΅κ³λ₯Ό λ³΄κ³ μ€μ λ‘ νμν Providerλ§ μ§μ ν΄ κ²μ¦νλλ‘ μ ννλ λ°©μμ κΆμ₯ν©λλ€.
3. ν΄λΌμ°λ IP λ³λμ± λμ
μμ λͺ©νμμ μ€λͺ νμλ―, ν΄λΌμ°λμ IP λμμ μμλ‘ λ³κ²½λ©λλ€.
μ΄λ₯Ό λ°μνκΈ° μν΄ IP λμ νμΌμ κ°±μ νλ ν¨μλ₯Ό μ 곡νμ¬ λΌμ΄λΈλ¬λ¦¬μ λ²μ κ³Ό κ΄κ³ μμ΄ λ°νμμ λμμ μ λ°μ΄νΈν μ μλλ‘ κ΅¬μ±νμ΅λλ€.
μ΄λ₯Ό ν΅ν΄ μΈμ€ν΄μ€ μ¬μμμ΄λ λΌμ΄λΈλ¬λ¦¬ μ λ°μ΄νΈ μμ΄λ μ΅μ λμμ λ°μν μ μμΌλ©° μ€μΌμ€λ§μ΄λ μ΄λ²€νΈ νΈλ¦¬κ±° λ± μ ν리μΌμ΄μ μ΄ μνλ μμ μ κ°±μ λ‘μ§μ λ£μ μ μμ΅λλ€.
κ²°κ³Ό
μ¬λ΄μ λμ ν λΌμ΄λΈλ¬λ¦¬λ₯Ό λ²μ©μ μΌλ‘ μ¬μ©ν μ μλλ‘ λ°κΎΈμ΄ μ€ν μμ€λ‘ 곡κ°νμ΅λλ€.
λ¬Έμ κ°μ , λΉλκΈ° μ²λ¦¬ μΆκ° λ± ν΄μΌ ν μμ λ€μ΄ μμ§ λ¨μ μμ΅λλ€. νλμ© ν΄κ²°νλ©° λ°μ μμΌ λκ°λ €κ³ ν©λλ€. κΈ°μ¬λ μΈμ λ νμμ λλ€!