Shiny: clientDataμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ IP μ£Όμ†Œλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€μ •

에 λ§Œλ“  2013λ…„ 04μ›” 05일  Β·  22μ½”λ©˜νŠΈ  Β·  좜처: rstudio/shiny

x-forwarded-for 헀더λ₯Ό 확인해야 ν•˜λŠ” 경우 μžμ„Έν•œ λ‚΄μš©μ€ μ €μ—κ²Œ λ¬Έμ˜ν•˜μ‹­μ‹œμ˜€.

Consult Team Advanced Medium Medium Type

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

ν΄λΌμ΄μ–ΈνŠΈμ˜ IP μ£Όμ†Œμ— μ•‘μ„ΈμŠ€ν•˜λŠ” 것은 λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œλ„ 맀우 μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€. λ‹€μŒ λ¦΄λ¦¬μŠ€μ—μ„œ 이 κΈ°λŠ₯을 λ³Ό 수 μžˆλŠ” κΈ°νšŒκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  22 λŒ“κΈ€

λ˜ν•œ HTTP μš”μ²­ 헀더.

이에 λŒ€ν•œ μ›€μ§μž„μ΄ μžˆμ—ˆμŠ΅λ‹ˆκΉŒ? @jcheng5

@coatless μ•„λ‹ˆμš”, 근데 그게 μ™œ ν•„μš”ν–ˆμ–΄μš”?

학생듀이 μˆ™μ œλ₯Ό μ œμΆœν•  수 μžˆλ„λ‘ μ„€μ •ν•œ λ°˜μ§μ΄λŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ 앱은 μž‘μ—… 제좜 μ‹œ μ‚¬μš©μž 이름과 제좜 μ‹œκ°„λ§Œ 기둝할 수 μžˆμŠ΅λ‹ˆλ‹€. λΉ›λ‚˜λŠ” μ•±μœΌλ‘œ μ „λ‹¬λ˜λŠ” IP μ£Όμ†Œμ— λŒ€ν•œ μš”μ²­μ€ 제좜된 ν• λ‹Ήκ³Ό ν•¨κ»˜ μ‚¬μš©μžμ˜ IPλ₯Ό μ €μž₯ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 이것은 λ‚˜μ˜ ν˜„μž¬ μ„€μ •μ—μ„œ 두 개의 제좜물이 μœ μ‚¬ν•˜κ²Œ μˆœμœ„κ°€ 맀겨쑌기 λ•Œλ¬Έμ— 학문적 μ²­λ ΄μ„± μœ„λ°˜μ„ λ’·λ°›μΉ¨ν•˜λŠ” μΆ”κ°€ 증거λ₯Ό μ œκ³΅ν•  κ²ƒμž…λ‹ˆλ‹€.

μš”μ²­ IP λ…ΈμΆœμ— λŒ€ν•œ 또 λ‹€λ₯Έ νˆ¬ν‘œ

또 ν•œ ν‘œ.

앱이 Connect λ˜λŠ” Shinyapps.io λ₯Ό μ‚¬μš©ν•˜μ—¬ 배포된 경우 이λ₯Ό μˆ˜ν–‰ν•˜λŠ” μ•½κ°„μ˜

library(shiny)

ui_xfwd <- NULL

ui <- function(req) {
  if ("HTTP_X_FORWARDED_FOR" %in% ls(req)) ui_xfwd <<- req[["HTTP_X_FORWARDED_FOR"]]
  fluidPage(
    h3("result"),
    uiOutput("result")
  )
}

server <- function(input, output, session) {
  output$result <- renderUI({
    if (!is.null(ui_xfwd)) {
      div(
        p("HTTP_X_FORWARDED_FOR header present in UI:"),
        p(ui_xfwd)
      )
    } else {
      div(
        p("HTTP_X_FORWARDED_FOR header not present; here's the REMOTE_ADDR:"),
        p(session$request[["REMOTE_ADDR"]])
      )
    }
  })
}

shinyApp(ui, server)

μ €λŠ” 이런 μ‹μœΌλ‘œ ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. 쑰금 더 κ°•λ ₯ν•œ ν•΄κ²° 방법을 κ²Œμ‹œν•  κ²ƒμž…λ‹ˆλ‹€.

@ jcheng5 κ°•λ ₯ν•œ 방법에 λŒ€ν•œ 에타가 μžˆμŠ΅λ‹ˆκΉŒ?

지연 λΌμ„œ μ£„μ†‘ν•©λ‹ˆλ‹€. @bborgesr 의 λ°©λ²•μ˜ λ¬Έμ œμ μ€ μ„œλ²„ κΈ°λŠ₯이 싀행될 λ•Œλ§ˆλ‹€ λ°”λ‘œ μ•žμ˜ UI μš”μ²­μ΄ λ™μΌν•œ λΈŒλΌμš°μ €μ—μ„œ 온 것이라고 κ°€μ •ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ°˜λ“œμ‹œ 사싀은 μ•„λ‹™λ‹ˆλ‹€. νŠΈλž˜ν”½μ΄ κ²ΉμΉ˜κ±°λ‚˜ μ‚¬μš©μžκ°€ λ’€λ‘œ λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ UIκ°€ μΊμ‹œλ˜μ–΄ μ΄λŸ¬ν•œ μš”μ²­μ΄ 연속적이지 μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

사기에 λŒ€ν•΄ λ„ˆλ¬΄ κ±±μ •ν•˜μ§€ μ•ŠλŠ” 경우 더 μ•ˆμ •μ μΈ 방법은 μƒμ„±λœ UI에 IP μ£Όμ†Œλ₯Ό μ‚½μž…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. <input type="hidden"> λŒ€ν•œ μž…λ ₯ 바인딩이 있으면 μ’‹κ² μ§€λ§Œ ν˜„μž¬λŠ” μ—†κΈ° λ•Œλ¬Έμ— λŒ€μ‹  ν…μŠ€νŠΈ μž…λ ₯을 숨길 수 μžˆμŠ΅λ‹ˆλ‹€.

library(shiny)

ui <- function(req) {
  fluidPage(
    div(style = "display: none;",
      textInput("remote_addr", "remote_addr",
        if (!is.null(req[["HTTP_X_FORWARDED_FOR"]]))
          req[["HTTP_X_FORWARDED_FOR"]]
        else
          req[["REMOTE_ADDR"]]
      )
    )
  )
}

server <- function(input, output, session) {
  cat("The remote IP is", isolate(input$remote_addr), "\n")
}

shinyApp(ui, server)

사기가 더 κ±±μ •λœλ‹€λ©΄ λΆˆν–‰νžˆλ„ μ„œλ²„ μ œν’ˆμ— μ μ ˆν•œ μˆ˜μ • 사항이 적용될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•©λ‹ˆλ‹€.

@jcheng5 μ μ ˆν•œ μˆ˜μ • 사항이 μ–Έμ œ μ°©λ₯™ν• 

@coatless μ‹€μ œλ‘œ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ‹ˆ Shiny Server Proμ—μ„œ 이미 μž‘λ™ν•΄μ•Ό ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€( /etc/shiny-server/shiny-server.conf λ‹€μŒ μΆ”κ°€).

whitelist_headers "x-forwarded-for";

그런 λ‹€μŒ μ„œλ²„ κΈ°λŠ₯ λ‚΄μ—μ„œ session$req$HTTP_X_FORWARDED_FOR λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 Shiny Server Open Source(cc @alandipert @shalutiwari)의 λ‹€μŒ 버전에 λŒ€ν•œ 쒋은 후보가 될 κ²ƒμ΄μ§€λ§Œ ν™•μ‹€νžˆ 2μ›” μ΄ˆμ— rstudio::conf 이전에 또 λ‹€λ₯Έ λ¦΄λ¦¬μŠ€λŠ” 없을 κ²ƒμž…λ‹ˆλ‹€. κ·Έλž˜μ„œ 적어도 λͺ‡ 달. 이보닀 더 ꡬ체적으둜 λ§μ”€λ“œλ¦΄ 수 μ—†μ–΄ μ£„μ†‘ν•©λ‹ˆλ‹€.

@jcheng5 ν›Œλ₯­ν•©λ‹ˆλ‹€. 천만 κ°μ‚¬ν•©λ‹ˆλ‹€!

신경쓰지 λ§ˆμ„Έμš”. whitelist_headers λŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μž‘λ™ν•˜λŠ” μ½”λ“œ κ²½λ‘œμ—λŠ” μ²˜μŒλΆ€ν„° μ˜¬λ°”λ₯Έ 헀더가 μ—†μŠ΅λ‹ˆλ‹€. λ‚΄κ°€ 이것을 μ•Œμ•„λ‚Ό 수 μžˆλŠ”μ§€ 보자.

본인(및 @alandiper)에 λŒ€ν•œ μ°Έκ³  사항:

  • node-http-proxy에 λŒ€ν•œ xfwd κ΅¬ν˜„μ€ 이상적이지 μ•ŠμŠ΅λ‹ˆλ‹€. μ—¬κΈ°λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€ . κΈ°μ‘΄ X-Forwarded-For 헀더λ₯Ό μœ μ§€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(ν”„λ‘μ‹œμΈ 경우 μ—…μŠ€νŠΈλ¦Ό ν”„λ‘μ‹œκ°€ μ‹ λ’°ν•  수 μžˆλŠ” 경우 κΈ°μ‘΄ X-Forwarded-For 헀더 끝에 remote-addrλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. ). μ΄μƒμ μœΌλ‘œλŠ” 이것을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  λŒ€μ‹  lib/proxy/http.js μ—μ„œ μ΄λŸ¬ν•œ 헀더λ₯Ό 직접 κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ κ΄€λ¦¬μžκ°€ μ—…μŠ€νŠΈλ¦Ό ν”„λ‘μ‹œκ°€ μ‹ λ’°ν•  수 μžˆλŠ”μ§€(λ˜λŠ” 더 λ‚˜μ€ λ°©λ²•μœΌλ‘œ μ–΄λ–€ IPλ₯Ό μ‹ λ’°ν•  수 μžˆλŠ” ν”„λ‘μ‹œλ‘œ κ°„μ£Όν•΄μ•Ό ν•˜λŠ”μ§€) μ•Œλ €μ£ΌκΈ°λ₯Ό 원할 κ²ƒμž…λ‹ˆλ‹€.
  • websocket에 X-Forwarded-* λ₯Ό κ΅¬ν˜„ν•˜λŠ” 것은 κ°„λ‹¨ν•©λ‹ˆλ‹€. SockJSλŠ” μ΄λŸ¬ν•œ 헀더λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€. lib/proxy/sockjs.js μ—μ„œ createWebSocketClient λŠ” 헀더λ₯Ό 두 번째 인수둜 ν—ˆμš©ν•  수 있으며 conn.$conn._conn.headers λ₯Ό 톡해 μš”μ²­ 헀더λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€(λΆ„λͺ…νžˆ 개인 ν•„λ“œλ₯Ό μ½λŠ” λŒ€μ‹  μ ‘κ·Όμžλ₯Ό μΆ”κ°€ν•΄μ•Ό 함).

이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? μƒ€μ΄λ‹ˆ λ‚΄λΆ€μ˜ μš”μ²­ IPλ₯Ό λ…ΈμΆœν•˜λŠ” 것은 맀우 μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈμ˜ IP μ£Όμ†Œμ— μ•‘μ„ΈμŠ€ν•˜λŠ” 것은 λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œλ„ 맀우 μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€. λ‹€μŒ λ¦΄λ¦¬μŠ€μ—μ„œ 이 κΈ°λŠ₯을 λ³Ό 수 μžˆλŠ” κΈ°νšŒκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

앱이 Connect λ˜λŠ” Shinyapps.io λ₯Ό μ‚¬μš©ν•˜μ—¬ 배포된 경우 이λ₯Ό μˆ˜ν–‰ν•˜λŠ” μ•½κ°„μ˜

library(shiny)

ui_xfwd <- NULL

ui <- function(req) {
...

Shiny Module λ‚΄μ—μ„œ μš”μ²­ 정보에 μ ‘κ·Όν•  수 μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

Shiny Module λ‚΄μ—μ„œ μš”μ²­ 정보에 μ ‘κ·Όν•  수 μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

@jcheng5 (https://github.com/rstudio/shiny/issues/141#issuecomment-351857670)κ°€ μ œμ•ˆν•œ μ ‘κ·Ό 방식은 λͺ¨λ“ˆ λ‚΄μ—μ„œ μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€(μ™„μ „νžˆ μ§€μ›λ˜λ©΄)

@jcheng5 (https://github.com/rstudio/shiny/issues/141#issuecomment-352564869)κ°€ μš”μ²­ ν™˜κ²½(μ½”λ“œμ˜ req )을 μ„œλΈŒλ‘œ μ „λ‹¬ν•˜μ—¬ μž‘λ™ν•˜λŠ” μ†”λ£¨μ…˜μ„ μ–»μ—ˆμŠ΅λ‹ˆλ‹€. - 메인 UI κΈ°λŠ₯의 λͺ¨λ“ˆ.

κ·ΈλŸ¬λ‚˜ 이제 λ‹€λ₯Έ μ»΄ν“¨ν„°μ—μ„œ μ•‘μ„ΈμŠ€ν•˜λŠ” κ²½μš°μ—λ„ 127.0.0.1 값이 ν‘œμ‹œλ©λ‹ˆλ‹€. μ˜ˆμƒλ˜λŠ” μΌμž…λ‹ˆκΉŒ?

μ˜ˆμƒλ˜μ§€ μ•Šμ€ 것 κ°™μ§€λ§Œ λ•Œλ•Œλ‘œ μ‚¬μš©μžμ—κ²Œ λ°œμƒν•©λ‹ˆλ‹€. https://groups.google.com/d/msg/shiny-discuss/9WcbS3E4Cfc/9hRS6VDyTxYJ

Apache μ—­ ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•˜μ—¬ 이 μ†”λ£¨μ…˜μ„ μ μš©ν•˜λŠ” 방법을 μ•„λŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄ VM에 μ„€μΉ˜λœ RStudio μ„œλ²„μ—μ„œ 이 μ†”λ£¨μ…˜μ„ μ‹€ν–‰ν•˜λ©΄ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€λ§Œ μ—­ ν”„λ‘μ‹œκ°€ κ΅¬ν˜„λœ ν”„λ‘œλ•μ…˜μ— 전달할 λ•Œ IPλŠ” 항상 127.0.0.1μž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰