프로그래밍/서버, DBMS

PostgreSQL listen_addresses 기준 정리

포도알77 2026. 6. 8. 11:49

PostgreSQL listen_addresses 기준 정리

listen_addresses는 PostgreSQL 서버가 어떤 TCP/IP 주소에서 접속을 받을지 정하는 설정이다. 2026년 6월 8일 기준 current 문서는 PostgreSQL 18.4 문서이며, 이 문서에서 기본값은 localhost로 안내된다. 즉 기본 상태에서는 같은 서버 안에서의 loopback TCP 연결만 허용된다.

실무에서는 원격 접속을 열어야 하는지, 모든 인터페이스를 한 번에 열어도 되는지, 그리고 pg_hba.conf와 각각 무엇이 다른지가 가장 자주 헷갈린다. 이 글은 PostgreSQL 공식 문서 기준으로 listen_addresses의 의미, 자주 쓰는 값, 안전하게 고르는 기준을 정리한다.

listen_addresses는 무엇을 제어할까?

공식 문서에서 listen_addresses는 서버가 클라이언트 애플리케이션의 연결 시도를 받을 TCP/IP 주소 목록을 지정하는 값으로 설명된다. 값 형식은 호스트명이나 숫자 IP 주소의 쉼표 구분 목록이다.

중요한 점은 이 설정이 "누가 로그인할 수 있는지"를 정하는 것이 아니라 "어느 네트워크 인터페이스에서 연결 시도 자체를 받을지"를 정한다는 점이다. 인증과 허용 범위의 세부 제어는 여전히 pg_hba.conf가 맡는다.

기본값과 자주 쓰는 값은?

공식 문서 의미 실무 해석
localhost 로컬 loopback TCP 연결만 받는다. 단일 서버 안에서만 접속하는 기본값으로 가장 보수적이다.
* 사용 가능한 모든 IP 인터페이스를 연다. 간단하지만 노출 범위가 넓어져서 주소 필터링을 다른 계층에 더 의존하게 된다.
0.0.0.0 모든 IPv4 주소를 연다. IPv4만 대상으로 전체 개방이 필요할 때 쓴다.
:: 모든 IPv6 주소를 연다. IPv6 환경에서 전체 개방이 필요할 때 쓴다.
빈 값 어떤 IP 인터페이스도 듣지 않는다. 이 경우 TCP/IP 연결은 막히고 Unix-domain socket만 사용할 수 있다.

공식 문서는 목록이 비어 있으면 어떤 IP 인터페이스에서도 listen하지 않으며, 이 경우 Unix-domain socket으로만 연결할 수 있다고 설명한다. 반대로 목록이 비어 있지 않으면 서버는 적어도 하나의 TCP/IP 주소를 열 수 있을 때 시작하고, 열지 못한 주소에 대해서는 warning을 남긴다.

대부분의 환경에서는 어떤 값을 고르면 될까?

원격 클라이언트가 전혀 필요 없으면 기본값인 localhost가 가장 단순하다. 애플리케이션과 PostgreSQL이 같은 서버 안에서만 통신한다면, 굳이 외부 인터페이스까지 열 이유가 없다.

원격 접속이 필요하더라도 문서 관점에서 바로 *를 고르는 것이 필수는 아니다. 특정 내부 IP만 명시할 수 있으면 그 편이 노출 면을 줄인다. 공식 문서도 listen_addresses가 insecure network interface에서 반복적인 악성 연결 요청을 줄이는 데 도움이 될 수 있다고 설명한다.

  • 단일 서버 애플리케이션: localhost 유지가 무난하다.
  • 내부망의 특정 NIC만 열어야 하는 서버: 그 IP 주소만 명시하는 편이 단순하다.
  • 주소가 자주 바뀌거나 모든 인터페이스 수신이 필요한 환경: * 또는 0.0.0.0, ::를 검토하되 방화벽과 pg_hba.conf를 함께 좁혀야 한다.

pg_hba.conf와는 무엇이 다를까?

두 설정은 역할이 다르다. listen_addresses는 서버 프로세스가 어느 인터페이스에서 연결 시도를 받을지 정하고, pg_hba.conf는 그 연결을 어떤 사용자, 어떤 주소 대역, 어떤 인증 방식으로 처리할지 정한다.

current 문서의 pg_hba.conf 설명은 원격 TCP/IP 연결이 가능하려면 적절한 listen_addresses 값으로 서버가 시작되어 있어야 한다고 명시한다. 즉 pg_hba.conf만 열어 두어도 listen_addresses가 기본값 localhost라면 외부 원격 접속은 되지 않는다.

반대로 listen_addresses = '*'로 열어도 pg_hba.conf가 허용하지 않으면 로그인은 성립하지 않는다. 실무에서는 두 값을 서로 대체재로 보면 안 된다.

설정을 바꾸면 reload로 끝날까?

아니다. current 문서는 이 파라미터를 server start에만 설정할 수 있다고 설명한다. 즉 pg_reload_conf() 같은 reload만으로는 반영되지 않고 서버 재시작이 필요하다.

이 점은 운영 절차에서 중요하다. pg_hba.conf는 reload로 다시 읽을 수 있지만 listen_addresses는 그렇지 않으므로, 원격 접속 경로를 새로 여는 작업은 재시작 창구를 고려해야 한다.

자주 헷갈리는 질문

1. listen_addresses를 비우면 로컬 접속도 모두 막힐까?

TCP/IP 기준으로는 그렇다. 하지만 공식 문서는 빈 값일 때 Unix-domain socket은 계속 사용할 수 있다고 설명한다. 따라서 로컬 애플리케이션이 소켓으로 붙는 구성이라면 접속이 완전히 사라지는 것은 아니다.

2. 별표 하나면 설정이 끝날까?

아니다. *는 수신 인터페이스 범위만 넓힌다. 실제 접속 허용은 pg_hba.conf, 방화벽, 라우팅, TLS 설정 같은 다른 계층과 함께 봐야 한다.

3. 일부 주소를 열지 못해도 서버가 시작될 수 있을까?

그럴 수 있다. current 문서는 목록이 비어 있지 않을 때 적어도 하나의 TCP/IP 주소를 열 수 있으면 서버가 시작하고, 열지 못한 주소에 대해서는 warning을 남긴다고 설명한다.

FAQ

Q. 운영 서버라면 무조건 *보다 명시적 IP가 나을까?

공식 문서는 정책 우선순위를 강제하지는 않지만, 인터페이스 수신 범위를 줄이는 것이 악성 연결 요청 노출을 줄이는 데 도움이 될 수 있다고 설명한다. 따라서 고정된 내부 IP만 필요하다면 그 주소만 명시하는 쪽이 더 보수적이다.

Q. listen_addresses만 바꾸면 외부에서 바로 접속할 수 있을까?

아니다. current 문서 기준으로 원격 연결은 listen_addressespg_hba.conf가 모두 맞아야 하고, 네트워크 경로와 방화벽도 통과해야 한다.

Q. 기본값 localhost는 TCP를 아예 안 쓰는 뜻일까?

아니다. 이는 loopback TCP/IP 연결을 허용하는 값이다. TCP 자체를 끄려면 빈 값으로 두고 소켓만 사용해야 한다.

정리

listen_addresses는 PostgreSQL이 어느 TCP/IP 인터페이스에서 접속 시도를 받을지 정하는 설정이고, 2026년 6월 8일 기준 PostgreSQL 18.4 current 문서의 기본값은 localhost다. 실무 판단 기준은 원격 접속 필요 여부, 특정 NIC만 열 수 있는지, 그리고 pg_hba.conf 및 방화벽을 함께 좁힐 수 있는지다.

같은 서버 내부 통신만 필요하면 기본값 유지가 단순하고, 원격 접속이 필요하면 전체 개방보다 필요한 인터페이스만 명시하는 편이 더 보수적이다. 어느 경우든 listen_addressespg_hba.conf를 분리해서 생각하는 것이 핵심이다.

참고 자료

반응형
페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사