λ°±μλμμ ν΄λΌμ΄μΈνΈμ IPλ₯Ό λ‘κΉ νλ λ°©λ²
2023. 02. 24.
μλ§λ μ¬λ¬λΆλ€μ μ§μ λ§λ λ°±μλκ° νλ μ―€μ μμκ±°λ€.
λμ κ²½μ°μλ api.tmpf.me μ΄ μμλλ° νκ°μ§ μμ¬μ΄ μ μ΄ μμλ€.
λ°λ‘ user access logging.., μ μνλ μ μ λ€μ κΈ°λ‘μ λ¨κΈ°λ μμ
μ΄ λΆμ‘±νλ€.
μ¬μ€ κΌ νμνμ§ μμ μλ μλλ° λ νμνλ€κ³ μκ°νλ©΄μ κΈμ μ½μ΄λ³΄μ.
μ°μ μ¬λ¬κ°μ§ μΈνλΌ κ΅¬μ±μ΄ μμ μ μλ€.
κ·Έ μ€μμ ν΄λΌμ΄μΈνΈμ μλ²κ° λ°λ‘ ν΅μ νλ κ²½μ°
λ§€μ° κ°λ¨νκ² μ²λ¦¬ν μ μλ€.
λ°λ‘ RemoteAddr νλλ₯Ό νμ±ν΄μ μ¬μ©νλ©΄ λλ€.
μλ μ΄λ―Έμ§μ 보μ΄λ κ²μ²λΌ 211.104.53.76 μ΄ λ°λ‘ ν΄λΌμ΄μΈνΈμ IPμ΄λ€.
(κΈμ μμ±νκ³ μλ λ΄ IP)

λλ²μ§Έ κ²½μ°λ€.
μλ²μ μ€κ°μ νλ‘μ μλ²κ° μ‘΄μ¬νλ κ²½μ°μ΄λ€.
μ΄ κ²½μ°μλ μλ‘κ² μμμΌλλ κ²μ΄ μλλ° X-Forwarded-For ν€λμ΄λ€.
ν΄λΉ ν€λλ νλ‘μλ₯Ό μ§λ λ μ μ€λλ RemoteAddrλ₯Ό νλ‘μ λ€μ μλΉμ€κΉμ§ μ λ¬νκΈ° μν΄ λ§λ μ¬μ€μμ νμ€ ν€λμ΄λ€.
λ€μ μ€ν¬λ¦°μ·μ whoami μλΉμ€κ° 2κ°μ 리λ²μ€ νλ‘μ λ€μμ μ€νλκ³ μλ κ²½μ°μ΄λ€.

μμΈν보면 μλ³Έ ν΄λΌμ΄μΈνΈ IPλ₯Ό λ£μ μ μλ λΆλΆμ΄ 2κ°μ§ μ‘΄μ¬νλλ° ν΄λΌμ°λνλ μ΄μμ μΆκ°ν Cf-Connecting-Ip νλμ X-Forwarded-For νλμ 첫λ²μ§Έ κ°μ΄λ€.
μ°μ Cf-Connecting-Ip μ κ²½μ° ν΄λΌμ°λνλ μ΄μμ Proxied recordsλ₯Ό μ¬μ©νλ κ²½μ°μλ§ ν΄λΉλλ―λ‘ μ μΈνκ³ μλμ X-Forwarded-For ν€λλ₯Ό μ μ¬ν μ΄ν΄λ³΄μ.
첫λ²μ§Έ κ°μ λΆλͺ
client ip μ΄λ€. κ·ΈλΌ λ€μ κ°μ 무μμΌκΉ?
λ°λ‘ ν΄λΌμ°λνλ μ΄ νλ‘μ μλ²μ μμ΄νΌμ΄κ³ κ·Έ λ€μ μμμ client ip μλ RemoteAddrμ κ²½μ° ν΄λΌμ°λνλ μ΄ λ€μ 리λ²μ€νλ‘μμΈ traefikμ μμ΄νΌμ΄λ€.
μμ μ΄λ―Έμ§μ μμ΄νΌλ λ€λ₯΄μ§λ§ λ€μκ³Ό κ°μ ꡬ쑰λ₯Ό μ§λλ€.
X-Forwarded-For ν€λλ νλ‘μλ₯Ό νλ μ§λ λ κΈ°μ‘΄μ RemoteAddr λΆλΆμ X-Forwarded-For ν€λμ appendνκ³ λ³ΈμΈμΈ νλ‘μ μλ²μ IPκ° RemoteAddrμ λ€μ΄κ°λ νμμ΄λ€.
λ°λΌμ βλλΆλΆμ κ²½μ°βμ λ€μ λ‘μ§μ μ μμ μΌλ‘ ν΄λΌμ΄μΈνΈμ IPλ₯Ό κ°μ Έμ€λλ° μ±κ³΅νλ€.
forward := r.Header.Get("X-Forwarded-For")
var ip string
var err error
if forward != "" {
// With proxy
ip = strings.Split(forward, ",")[0]
} else {
// Without proxy
ip, _, err = net.SplitHostPort(r.RemoteAddr)
if err != nil {
http.Error(w, "Error parsing remote address ["+r.RemoteAddr+"]", http.StatusInternalServerError)
return
}
}κ·Όλ° μμ λ‘μ§μλ μ¬κ°ν μ€λ₯κ° νκ°μ§ μ‘΄μ¬νλ€.
λ§μ½ μμμ λ£μ IPλ‘ μ κ·Όμ μ΄λ₯Ό νλ€κ³ μκ°ν΄λ³΄μ.
μλ²κ° νλ‘μκ° μλ μνμ΄λ μλ μνμ΄λ r.HeaderλΌλ κ°μ βμ μ μκ²μβ μ μ‘λκ² λμ΄μλ€.
λν X-Forwarded-For ν€λλ λ§ κ·Έλλ‘ HTTP ν€λμ΄λ€.
ν€λλ κ°λ¨νκ² μ‘°μ κ°λ₯νλ€.
λ§μ½ X-Forwarded-For ν€λλ₯Ό μ²μ μ μ‘ν λ βμΆκ°β ν μνλ‘ μ μ‘νκ² λλ€λ©΄ λ€μκ³Ό κ°μ ννλ‘ μ μ‘λλ€.
X-Forwarded-For: <λ³μ‘°νμ¬ μΆκ°ν IP A>, <ν΄λΌμ΄μΈνΈμ μ€μ IP B>, <PROXY 1 C>
λ¬Όλ‘ κ²½μ°μ λ°λΌμ proxy Cκ° μμ μλ μκ³ , ν΄λΌμ΄μΈνΈμ μ€μ IPκ° RemoteAddrμ μμ μλ μμ§λ§ μκ΄ μλ€.
μμ λ Όλ¦¬λλ‘λ©΄ XFF ν€λκ° μ€μ λμ΄ μλ€. β XFF ν€λ 첫λ²μ§Έ κ°μ μ½λλ€. μ΄κΈ° λλ¬Έμ μ μ κ° λ³μ‘°νμ¬ μΆκ°ν κ°μ΄ μ€μ IPλ‘ μΈμλκ² λλ€.
μ΄κ±΄ λ¬Έμ λ€.
λ°λΌμ μ΄κ±Έ μ²λ¦¬ν λ³λμ λ‘μ§μ΄ νμνλ° β¦..
λλΆλΆμ νλ‘λμ
νλ‘κ·Έλ¨μμ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ μ°Ύμλλ€.
μλ‘μ΄ μ€μ κ° FORWORDEDλ₯Ό μμ±νλ€.
μ΄ μ€μ κ°μ μ«μλ‘ κ° μ«μλ λ€μμ λνλΈλ€.
| μ«μ | μλ―Έ |
|---|---|
| 0 | 리λ²μ€νλ‘μκ° μμΌλ©° RemoteAddrλ₯Ό μ¬μ©ν©λλ€. |
| 1 | μλΉμ€ μμ 1κ°μ 리λ²μ€ νλ‘μκ° μμΌλ©° XFF ν€λμ -1 λ²μ§Έ κ°μ μ¬μ©ν©λλ€. |
| .. | .. |
| 3 | μλΉμ€ μμ 3κ°μ 리λ²μ€ νλ‘μκ° μμΌλ©° XFF ν€λμ -3 λ²μ§Έ κ°μ μ¬μ©ν©λλ€. |
| 4 | μλΉμ€ μμ 4κ°μ 리λ²μ€ νλ‘μκ° μμΌλ©° XFF ν€λμ -4 λ²μ§Έ κ°μ μ¬μ©ν©λλ€. |
| .. | .. |
μ΄λ κ² νλ€λ©΄ λΉμ₯ μ¬μ©μκ° ν€λ κ°μ λ³μ‘°νμ¬ λ³΄λΈ κ²½μ°μλ μ€μ κ°μ μ΄κ³Όνλ μμ²μ λν΄μλ κ·Έλ₯ 무μ νκΈ°μ λ³ μμμ λ°μ§ μκ² λλ€.
μλ₯Ό λ€μ΄ ν΄λΌμ°λ νλ μ΄μ traefikλ₯Ό κ±°μ³μ μλΉμ€λ‘ νΈλ ν½μ΄ λμνλ κ²½μ° FORWORDED νκ²½λ³μλ₯Ό 2λ‘ μ€μ νκ³ XFF ν€λ λ°°μ΄μμ -2λ²μ§Έ κ°μ μ¬μ©νκ² λλ€.
λ°λΌμ μ μ κ° μμλ‘ κ°μ μΆκ°νμ¬λ 무μλλ€λ μλ―Έμ΄λ€.
κ·Όλ° μ΄ λ°©λ²μ μμ λ§νλ― μλ²½νμ§ μλ€.
μλνλ©΄ λκ° μ€μ κ°μ΄ μΆκ°λμκΈ° λλ¬Έμ λͺ¨λ νκ²½μμ μ μνμ¬ μλΉμ€νλ κ²μ΄ λΆκ°λ₯νλ€.
β οΈ λ€λ‘λ μ¬λ―ΈμκΈ΄ νλ μ 리λμ΄ μμ§ μμ΅λλ€. tl;dr β οΈ
- FORWORDED νκ²½ λ³μλ μκ°λ³΄λ€ λμμ§ μλ λ°©μμ΄λ€. μΆμ²νλ€.
- XFF ν€λμ μμ΄νΌ λμμ μ λ’°νλ νλ‘μμ λμμΌλ‘ μ€μ νλ λ°©λ²λ μλ€.
- XFF ν€λλ μ‘°μμ΄ κ°λ₯νλ λ―Ώμ§ λ§μ.
μ΄μ©λ€ 보λ burp suiteλ₯Ό μ΄μ©ν΄μ λ΄κ° μ μν μ¬μ΄νΈλ₯Ό 곡격νκ³ μ½λλ₯Ό λ€μ κ²μ¦νκ³ μμΉ« κ·Έλ₯ λμ΄κ° μ μλ λΆλΆμ μ κ²νκΈ°κΉμ§ νλ€.
μ΄ λ¬Έμ λ μ΄λ»κ² μλ €μ Έ μμκΉ?
λ€μκ³Ό κ°μ μλ£λ€μ μ°Ύμ μ μμλλ° κ·Έ μ€ ν₯λ―Έλ‘μ΄ λͺκ°μ§ μλ£λ€.

https://blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
νλ§λλ‘ κΈμ΄μ΄κ° SSH ν°λλ‘ μΈν΄ μ°λ°μ μΌλ‘ XFF ν€λμ 127.0.0.1 μ£Όμκ° λ€μ΄κ°κ² λμλλ° μ΄λ₯Ό μ€νμ€λ²νλ‘μ°κ° βκ΄λ¦¬μβμ μ κ·ΌμΌλ‘ μΈμν΄ κΆν μμΉμ΄ μΌμ΄λ¬λ€λ μ΄μΌκΈ°μ΄λ€.
λ μ΄λ° μλ£λ μ°Ύμ μ μμλ€.
https://www.acunetix.com/vulnerabilities/web/x-forwarded-for-http-header-security-bypass/
XFF HTTP header security bypass, λΆλ₯λ²νΈ CWE-289
CTFd μ²λΌ νλ‘μ νμ μ ννμ¬ λ°©μ§νλ λ‘μ§μ΄ μλ κ²½μ°λ μμμ§λ§ λ¬΄λ € μ€νμ€λ²νλ‘μ°μμ κΆν μμΉμ΄ μΌμ΄λκΈ°λ νλ λ± μλΉν μ¬λ°λ κΈ°λ²μ΄μλ€.
μ¬λ―ΈμμΌλ μ‘°κΈ λ λμκ° λ€λ₯Έ μλΉμ€λ€μμ IP λ‘κΉ λ°©λ²μ 곡격νκ³ λΆμν΄λ³΄μ.
λ¨Όμ ifconfig.me μ΄λ€.
νμμ μ¦κ²¨μ°λ μλΉμ€μ΄κΈ°μ μ νν΄λ³΄μλ€.

λ€μκ³Ό κ°μ΄ proxy optionλ₯Ό μ ννμ¬ interceptλ₯Ό μ§ννλ€.

μλ¬΄λ° λ³μ‘°λ₯Ό νμ§ μμμ λ μλ΅μ΄λ€.

μμ² ν€λμ κ°μ λ‘ κ°μ λ£μ΄λ³΄μλ€.

λΆλͺ λ κ°μ μ‘°μλμλ€.
κ·Έλ λ€λ©΄ ifconfig.meλ μ΄λ€ λ°©μμΌλ‘ client ipλ₯Ό νμΈν κΉ?
githubμμ repoλ₯Ό μ°Ύμλ€.
GitHub - pmarques/ifconfig.me: Simple HTTP application for demos and tests
μΈμ€ μμμΌλ λ€λ₯Έ μλΉμ€μλ€λ μ΄μΌκΈ°..
μ€μ λ‘ λ‘컬μμ μ€νμν€κ³ βμ μ΄κ±΄ μλλ€ μΆμλ€.β
μ¬μ§μ΄ μ¬κΈ°μμ ν΄λΉ μ°νμ λν λλΉλ₯Ό νμ§ μμμΌλ©° μ¬μ€ ν νμκ° μμ§λ.. κ·Έλ₯ 보μ¬μ£Όλκ±°λκΉ ~
μ¬μ€ μ΄μΈμλ λ€μν λν¬κ° βA IP echo server inspired byΒ http://ifconfig.meβ λΌλ νμ΄ν νμ μ μλμ΄ μμλλ° λͺκ°μ§ λν¬μ IP νλ λ‘μ§μ κ°μ Έμ보μλ€.
ip := this.GetString("ip", this.Ctx.Input.IP())μ¬κΈ°μ this λ³μλ beego λΌμ΄λΈλ¬λ¦¬μ λΌμ°ν° νλΌλ―Έν°μλ€.
μ¬λ°λ κ±Έ μ°Ύμλ€.
Security issue: Trusted Reverse Proxy and X-Forwarded-* headers Β· Issue #4589 Β· beego/beego
μ§κΈ λ΄κ° ν΄κ²°νκ³ μ νλ λ¬Έμ μ λν μ΄μμΈλ°.. κ·Έλ₯ λ«νλ€.
μ΄λ λ€λ건 λλΆλΆμ beegoλ‘ μμ±λ golang λ°±μλ, κ·Έ μ€ μ΄μ μ μΈκΈν μ€νμ€λ²νλ‘μ°κ°μ λ‘μ§μ μ¬μ©νλ κ²½μ° κ°λ¨νκ² ν΄νΉν μ μλ€λ μ΄μΌκΈ°κ° λλ€.
// IP returns request client ip.
// if in proxy, return first proxy id.
// if error, return RemoteAddr.
func (input *BeegoInput) IP() string {
return (*context.BeegoInput)(input).IP()
}νμ beegoμ develop λΈλμΉμ μ½λ ꡬν λ° μ£Όμμ λ°μ΅ν΄ μλ€.
μ.. 2λ²μ μ£Όμμ λ»μ μ§μν΄λ³΄λ©΄ βμ°λ¦° κ·Έλ₯ 무μ§μ±μΌλ‘ XXF λ 첫 λ²μ§Έ κ° λΊ΄μ¬κΊΌμ γ γ± γ β

λ€μμ μ (*context.BeegoInput)(input).IP() ꡬν체λ€.
https://github.com/beego/beego/blob/031c0fc8af57ea1a18e21fd5a7a8e6f23c26bbea/server/web/context/input.go μ€ μΌλΆμ½λμ΄λ€.
// IP returns request client ip.
// if in proxy, return first proxy id.
// if error, return RemoteAddr.
func (input *BeegoInput) IP() string {
ips := input.Proxy()
if len(ips) > 0 && ips[0] != "" {
rip, _, err := net.SplitHostPort(ips[0])
if err != nil {
rip = ips[0]
}
return rip
}
if ip, _, err := net.SplitHostPort(input.Context.Request.RemoteAddr); err == nil {
return ip
}
return input.Context.Request.RemoteAddr
}μ΄κ±° λκ° κ΅¬νμ΄ μ΄μνλ€β¦
λ§μ§λ§ ν¬λ§μΌλ‘ input.Proxy() ꡬνμ 보μ
// Proxy returns proxy client ips slice.
func (input *BeegoInput) Proxy() []string {
if ips := input.Header("X-Forwarded-For"); ips != "" {
return strings.Split(ips, ",")
}
return []string{}
}κΉμ½β¦
μ΄κ² λ§λ μΆμ ꡬνμ΄λ€.
μΌλ¨ μ¬κΈ°κΉμ§ λ΄€μΌλ©΄ μ‘°μ©ν λ°©κΈ μ΄μλ₯Ό μ΄ μ λ μμ§λ§β¦ μΌλ¨μ beego λ΄λΆμμ IP() ꡬνμ μ΄λ»κ² μ¬μ©νλμ§ κ²μν΄λ³΄μ.
server/web/error.go
"AppError": fmt.Sprintf("%s:%v", BConfig.AppName, err),
"RequestMethod": ctx.Input.Method(),
"RequestURL": ctx.Input.URI(),
"RemoteAddr": ctx.Input.IP(),
"Stack": stack,
"BeegoVersion": beego.VERSION,
"GoVersion": runtime.Version(),μ΄κ±΄ μΌλ¨ RemoteAddrκ° μλλ€. μ΄λ¬λ©΄ μλ¬λ‘κ·Έλ₯Ό μμΌ μ μκ² λλ€.
server/web/server.go
record := &logs.AccessLogRecord{
RemoteAddr: ctx.Input.IP(),
RequestTime: requestTime,
RequestMethod: r.Method,
Request: fmt.Sprintf("%s %s %s", r.Method, r.RequestURI, r.Proto),μ¬κΈ°μλ λ§μ°¬κ°μ§μ΄λ€.
server/web/router.go
if p.cfg.RunMode == DEV && !p.cfg.Log.AccessLogs {
match := map[bool]string{true: "match", false: "nomatch"}
devInfo := fmt.Sprintf("|%15s|%s %3d %s|%13s|%8s|%s %-7s %s %-3s",
ctx.Input.IP(),
logs.ColorByStatus(statusCode), statusCode, logs.ResetColor(),
timeDur.String(),
match[findRouter],μ¬κΈ°λ dev λͺ¨λμμ μμΈμ€λ‘κΉ μ λ¬Έμ μλ ꡬνμ²΄λ‘ νκ² λλ€.
λ beegoμμ μμΈμ€λ‘κΉ μ λ―Ώμ§ μλκ±Έλ‘β¦
λ€μμ fiber, echoλ₯Ό μμλ³΄κ² λ€.
λκ° TrustedProxy κΈ°λ₯μ μΆκ°νλ€
IP Address | Echo - High performance, minimalist Go web framework
κ°λ°μκ° μμλ± ν΄λ²λ Έλ°.
κ²°λ‘
μ΄κ² λ΄ κ²°λ‘ μ΄λ€.
λ²μ©μ μΌλ‘ λ°°ν¬ν λ°±μλμμ μ²μ κ°λ°μκ° λ³λμ μ€μ νμΌ μμ΄ βμ λ’°ν μ μλβ ν΄λΌμ΄μΈνΈμ IPλ₯Ό μ»λλ€λ건 νλ€λ€.
νμ§λ§ λͺκ°μ§ μ ν κ°λ₯ν μ΅μ μ΄ μ‘΄μ¬νλλ°
- RemoteAddr λ§ λ―Ώκ³ λ°±μλλ₯Ό νλ‘μ μμ΄ λ°°ν¬νλ κ²½μ°
- XFF ν€λ 첫λ²μ§Έ κ°μ μ¬μ©νλ μ λ’°ν μ μλ μνλ‘ μ¬μ©
- μλ²κ° λ°°ν¬λ νκ²½μ νλ‘μ κ°―μλ₯Ό νκ²½λ³μλ‘ μ€μ νμ¬ μ λ’°ν μ μλ νλ‘μ κ°―μλ₯Ό μ€μ ν΄λΉ κ°―μ λ§νΌλ§ XFF ν€λλ₯Ό μ½λλ‘ μ€μ
- μ λ’°ν μ μλ νλ‘μμ IP λμλλ₯Ό μ€μ ν΄λκ³ κ°μ₯ κ°κΉμ΄ μ λ’°ν μ μλ XFFν€λμ IPλ₯Ό μ¬μ©
μ¬κΈ°μ 3λ²κ³Ό 4λ²μ μ€μ νμΌμ΄ νμνλ μ€μ λ§ μνλ€λ©΄ μΈμ λ μ λ’°ν μ μλ IPλ₯Ό κ°μ§κ² λκ³ ,
1λ²μ μ λ’°λ κ°λ₯νλ νκ²½μ λ°λΌ ν΄λΌμ΄μΈνΈ IPκ° μλ κ²½μ°κ° (νλ‘μκ° μ‘΄μ¬νλ κ²½μ°) μκΈΈ μ μλ€.
2λ²μ λ²μ©μ±μ λμΌλ μμ½κ² ν΄νΉν μ μλ€.
λ μ΄μΈμ ν΄κ²°λ°©λ²λ μ‘΄μ¬νλ€.
ν΄λΌμ°λνλ μ΄λ₯Ό μ¬μ©νλ€λ κ°μ νμ Cf-Conβ¦ ν€λλ₯Ό μ¬μ©νκ±°λ μλ² μλ¨μ μλ νλ‘μμμ X-Real-IP κ°μ μ€μ νκ³ κ·Έ κ±Έ μ λ’°νλ λ°©λ²λ± λ€μν λ°©λ²μ΄ μλ€.
μΈμ λ μ νμ΄ νμνκ³ λ λ°±μλ νλ‘κ·Έλ¨μ κ°λ°ν λλ μ¬μ©νκ² λ λ ν΄λΉ νλ‘κ·Έλ¨μ΄ μ΄λ ν₯ κ°λ°λμλμ§ λΆμνκ³ μ λ’°ν μ μλ λ°©μμΈμ§ κ²μ¦νμ¬μΌκ² λ€.
κ·Έλμ μ λ μ΄λ»κ² κ°λ°ν κ±°λλ©΄μβ¦
- XFF ν€λλ₯Ό μ¬μ©
- 무쑰건 μ λ’°κ° μλ λ‘컬주μμ ν΄λΌμ°λνλ μ΄μ IPλ₯Ό μ λ’°
- μΆκ° νλ‘μ μ΅μ μΌλ‘ RemoteAddrλ₯Ό μ¬μ©
- μΆκ° μ΅μ μ λ’° κ°λ₯ν νλ‘μ μ£Όμλ₯Ό μΆκ° ν μ μλλ‘ μ€μ
- μΆκ° μ΅μ νλ‘μ ν μλ‘λ§ μ€μ νμ¬ μ λ’°
κ·Όλ° λμ μλλ€.
κ·Έλλ WAFλ μ μ μλ μμΈμΌλ‘ μΈν΄ XFF λκ° κ°μ λ³κ²½λμ΄ κ³ μ λκ±°λ ν μλ μκΈ° λλ¬Έμ μΌλ°μΌλ€..
λ λ΄κ° κ°λ°ν λλ μ΄μ¬ν μ°Έκ³ ν΄μΌ
Q. μ μ νλ² κ΄μ μΈνλΌ μ κ² λΉμ XFF ν€λκ° μ€μ’ λλ μ΄μν μΌμ΄ μμμμ£ ?
κ·Έλ μμΈμ΄ λμλμ?
A. λ°λ³΄κ°μ΄ μ€μΌμ€νΈλ μ΄μ μ νλ΅μκ³ μ€μ ν΄λ swarmμμ overlay λ€νΈμν¬ μ€μ λλΆμ λ€νΈμν¬κ° μ΄μν΄μ§ νμ΄μμ΅λλ€.
νμ€ν μλ ¨λ κΈ°μ μκ° μμΌλ©΄ κΈ°μ λμ μ λ―Έλ€μΌλλ€κ³ λλ λλͺ©μ΄μμ£ .
Q. ipLogger νλ‘μ νΈλ₯Ό μ΅μ’ μ μΌλ‘ μ§ννμ ¨λλ°, μ΄λ€κ±Έ λλΌμ ¨λμ?
A. μκ°λ³΄λ€ λ§μ νλ‘μ νΈμμ XFF ν€λλ₯Ό λ―Ώκ³ μλ κ² κ°κ³ κ·Έ ꡬνμ΄ λΆμμ ν κ²½μ°λ μμμ΅λλ€.
λ¬Όλ‘ ipLogger νλ‘μ νΈκ° μλ²½νλ€λ κ²μ μλμ§λ§ μ μνλ©° λ‘κΉ κΈ°μ κ³Ό ν΄λΌμ΄μΈνΈμ μ§μ§ IPλ₯Ό μ»κ²λλ κΈ°μ λ©΄μμλ νμ€ν 곡λΆκ° λμμ΅λλ€.