Skip to main content

net

title: "net" description: "Chromium의 네이티브 네트워킹 라이브러리를 사용해 HTTP/HTTPS 요청 처리" slug: net hide_title: false

net

Chromium 네이티브 네트워킹 라이브러리를 사용해 HTTP/HTTPS 요청을 처리한다.

프로세스: Main, Utility

net 모듈은 HTTP(S) 요청을 처리하는 클라이언트 측 API다. Node.js의 HTTPHTTPS 모듈과 유사하지만, Node.js 구현 대신 Chromium 네이티브 네트워킹 라이브러리를 사용한다. 이를 통해 웹 프록시에 대한 더 나은 지원을 제공한다. 또한 네트워크 상태를 확인하는 기능도 지원한다.

net 모듈을 Node.js 네이티브 모듈 대신 사용해야 하는 이유는 다음과 같다:

  • 시스템 프록시 설정을 자동으로 관리하며, wpad 프로토콜과 프록시 pac 설정 파일을 지원한다.
  • HTTPS 요청을 자동으로 터널링한다.
  • 기본, 다이제스트, NTLM, Kerberos, 협상 인증 방식을 사용해 프록시 인증을 지원한다.
  • 트래픽 모니터링 프록시를 지원한다. 접근 제어와 모니터링을 위해 Fiddler와 유사한 프록시를 사용할 수 있다.

API 구성 요소(클래스, 메서드, 속성, 이벤트 이름 등)는 Node.js에서 사용하는 것과 유사하다.

예제 사용법:

const { app } = require('electron')
app.whenReady().then(() => {
const { net } = require('electron')
const request = net.request('https://github.com')
request.on('response', (response) => {
console.log(`STATUS: ${response.statusCode}`)
console.log(`HEADERS: ${JSON.stringify(response.headers)}`)
response.on('data', (chunk) => {
console.log(`BODY: ${chunk}`)
})
response.on('end', () => {
console.log('No more data in response.')
})
})
request.end()
})

net API는 애플리케이션이 ready 이벤트를 발생시킨 후에만 사용할 수 있다. ready 이벤트 전에 모듈을 사용하려고 하면 오류가 발생한다.

메서드

net 모듈은 다음과 같은 메서드를 제공한다:

net.request(options)

ClientRequest를 반환

ClientRequest 생성자에 직접 전달되는 options를 사용하여 ClientRequest 인스턴스를 생성한다. net.request 메서드는 options 객체에 지정된 프로토콜 스킴에 따라 보안 및 비보안 HTTP 요청을 발행하는 데 사용된다.

net.fetch(input[, init])

반환값: Promise<GlobalResponse> - Response 참조

렌더러에서 fetch()가 동작하는 방식과 유사하게, Chrome의 네트워크 스택을 사용해 요청을 보낸다. 이는 Node.js의 HTTP 스택을 사용하는 Node의 fetch()와는 다르다.

예제:

async function example () {
const response = await net.fetch('https://my.app')
if (response.ok) {
const body = await response.json()
// ... 결과를 사용한다.
}
}

이 메서드는 기본 세션에서 요청을 발행한다. 다른 세션에서 fetch 요청을 보내려면 ses.fetch()를 사용한다.

자세한 내용은 MDN 문서의 fetch()를 참조한다.

제한 사항:

  • net.fetch()data: 또는 blob: 스키마를 지원하지 않는다.
  • integrity 옵션의 값은 무시된다.
  • 반환된 Response 객체의 .type.url 값이 올바르지 않다.

기본적으로 net.fetch를 사용한 요청은 커스텀 프로토콜file:로도 전송할 수 있으며, webRequest 핸들러가 존재하면 이를 트리거한다. RequestInit에 비표준 bypassCustomProtocolHandlers 옵션이 설정되면, 이 요청에 대해 커스텀 프로토콜 핸들러가 호출되지 않는다. 이는 가로챈 요청을 내장 핸들러로 전달할 수 있게 한다. webRequest 핸들러는 커스텀 프로토콜을 우회할 때도 여전히 트리거된다.

protocol.handle('https', (req) => {
if (req.url === 'https://my-app.com') {
return new Response('<body>my app</body>')
} else {
return net.fetch(req, { bypassCustomProtocolHandlers: true })
}
})

참고: 유틸리티 프로세스에서는 커스텀 프로토콜이 지원되지 않는다.

net.isOnline()

boolean 타입의 값을 반환한다. 현재 인터넷 연결 상태를 나타낸다.

false를 반환하면 사용자가 원격 사이트에 연결할 수 없는 상태라는 강력한 신호다. 반면 true를 반환하더라도 특정 원격 사이트에 대한 연결 시도가 성공할지 여부는 확실하지 않다. 일부 링크가 활성화되어 있더라도 특정 연결 시도가 실패할 가능성이 있다.

net.resolveHost(host, [options])

  • host string - 해결할 호스트 이름.
  • options Object (선택 사항)
    • queryType string (선택 사항) - 요청할 DNS 쿼리 타입. 지정하지 않으면 리졸버가 IPv4/IPv6 설정에 따라 A 또는 AAAA (또는 둘 다)를 선택한다:
      • A - A 레코드만 가져온다.
      • AAAA - AAAA 레코드만 가져온다.
    • source string (선택 사항) - 해결된 주소를 가져올 소스. 기본값은 리졸버가 적절한 소스를 선택한다. 이 옵션은 큰 외부 소스(예: 시스템 호출 또는 DNS 사용)에만 영향을 미친다. 소스가 지정되어도 결과는 여전히 캐시, "localhost" 해결, IP 리터럴 등에서 올 수 있다. 다음 값 중 하나를 사용한다:
      • any (기본값) - 리졸버가 적절한 소스를 선택한다. 결과는 DNS, MulticastDNS, HOSTS 파일 등에서 올 수 있다.
      • system - 결과는 시스템 또는 OS에서만 가져온다. 예를 들어 getaddrinfo() 시스템 호출을 통해 가져온다.
      • dns - 결과는 DNS 쿼리에서만 가져온다.
      • mdns - 결과는 Multicast DNS 쿼리에서만 가져온다.
      • localOnly - 외부 소스를 사용하지 않는다. 결과는 소스 설정과 관계없이 사용 가능한 빠른 로컬 소스(예: 캐시, hosts 파일, IP 리터럴 해결 등)에서만 가져온다.
    • cacheUsage string (선택 사항) - DNS 캐시 항목을 사용할지 여부를 나타낸다. 다음 값 중 하나를 사용한다:
      • allowed (기본값) - 캐시가 오래되지 않았다면 결과가 호스트 캐시에서 올 수 있다.
      • staleAllowed - 캐시가 만료되었거나 네트워크 변경이 있었다 해도 결과가 호스트 캐시에서 올 수 있다.
      • disallowed - 결과가 호스트 캐시에서 오지 않는다.
    • secureDnsPolicy string (선택 사항) - 이 요청에 대한 리졸버의 Secure DNS 동작을 제어한다. 다음 값 중 하나를 사용한다:
      • allow (기본값)
      • disable

Returns Promise<ResolvedHost> - host에 대한 해결된 IP 주소로 이행된다.

이 메서드는 기본 세션에서 호스트를 해결한다. 다른 세션에서 호스트를 해결하려면 ses.resolveHost()를 사용한다.

속성

net.online 읽기 전용

boolean 타입의 속성이다. 현재 인터넷 연결이 되어 있는지 여부를 나타낸다.

이 속성이 false를 반환하면 사용자가 원격 사이트에 연결할 수 없을 가능성이 매우 높다. 하지만 true를 반환하더라도 특정 원격 사이트에 대한 연결 시도가 성공할지 여부는 확실하지 않다. 일부 링크가 활성화되어 있더라도 특정 연결이 성공할 것이라는 보장은 없다.