대략 아는대로만 설명을 드리겠습니다. 다음에 설명 드리는 글은 저가 나름대로 이해하고 있는 것을 설명 드린 것이며, 모두 다 테스트 해 보지 못한점 미리 밝혀 드립니다. 그러므로 틀린 답변이 될 가능성도 있다고 생각합니다.
혹시라도 테스트후 틀린 부분이 있다며 스스럼 없이 밝혀 주시면 이글을 읽는 모든이에게 도움이 될 것으로 생각됩니다.
PostgreSQL 로 접근하는 방법은 두가지가 있습니다. 하나는 Unix Domain Socket 를 통해서 PostgreSQL Server 로 접근하는 방법이고, 또 하나는 TCP/IP 포트를 통해서 접근하는 방법입니다.
이 두가지 방법의 결정은 $PGDATA/pg_hba.conf 파일에서 결정됩니다.
그러면 $PGDATA/pg_hba.conf 파일의 내용을 살펴 보도록 하겠습니다.
local all trust
host all 127.0.0.1 255.255.255.255 trust
host all 211.123.123.123 255.255.255.255 trust
이와 유사한 라인이 보일 것입니다.
여기서 제일 첫줄의
local all trust
이 UNIX Domain Socket 를 통한 접근 방식을 통제 해 주는 행입니다.
즉 로컬에서 접속시에는 Unix Domain Socket 으로 접근을 하며, 항상 접속을 허용해 주라는 뜻이 되지요. 이렇게 설정되어 있는 경우에는 pg_shadow 내의 password 를 아무리 설정해도 localhost 에서 접근하는 경우에는 무시하고 그냥 무조건 접근 허용을 해 주게 됩니다.
테스트를 위해서 다음과 같이 해 보시기 바랍니다.
psql -U postgres template1
update pg_shadow set passwd='aaa' where usename='postgres';
그리고 나서 pg_hba.conf 파일을 다음과 같이 수정하십시오.
local all password
그리고 나서 다시 접근해 봅니다.
psql -U postgres template1
이제는 password 에 'aaa' 라고 넣어 주어야 만이 접근이 될 것입니다.
즉 서버로의 접근은 일차적으로 pg_hba.conf 파일에서 조절을 하고 다음으로 pg_shadow 테이블의 내용을 참조로 한다는 것입니다.
그리고 만약 다음과 같이 입력을 하면 어떻게 될까요.
psql -h localhost -U postgres template1
이럴 경우에는 Unix Domain Socket 을 통해 접속하질 않습니다. TCP/IP 포트를 통해서 DB server 로 접근을 하게 됩니다. 이유는 localhost 라고 하는 디비 서버를 명시해 주었기 때문에 넷트워을 통한 접속을 시도하기 때문입니다. 이럴 경우에는 nslookup localhost 하여 나오는 IP 주소에 대해 pg_hba.conf 에서 명시한 대로 접속을 하게 됩니다. 일반적으로 127.0.0.1 로 IP 가 지정되어 있을 것이니...
$PGDATA/pg_hba.conf 파일에
host all 127.0.0.1 255.255.255.255 trust
로 되어 있다면 무조건 접속이 허용되겠지요.
도움이 되셨길 바랍니다.
그리고 pg_hba.conf 파일을 수정한 후에는 postmaster 를 다시 기동하지 않아도 됩니다.
-- 윤재호 님이 쓰신 글:
>> 첫번째 질문입니다.
>> 제가 alter user로 패스워드를 주었습니다.
>> ctums=# select * from pg_shadow;
>> usename | usesysid | usecreatedb | usetrace | usesuper | usecatupd | passwd | valuntil
>> ----------+----------+-------------+----------+----------+-----------+------------+----------
>> postgres | 508 | t | t | t | t | |
>> ctums | 509 | t | f | t | t | ctums2127# |
>> 패스워드는 잘 들어간것 같습니다.
>> 저는 C와 연동을 하고 있습니다.
>> C library를 보니 PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbName, userName, passWord); 접속하는 라이브러리가 있던군요.
>> dbName이나 userName이 틀리면 접속이 안 되지만, 패스워드는
>> 틀려도 잘 접속이 됩니다.
>> 아님 데몬를 다시 띄우면 되나요? (이건가)
>> 도무지 왜 그런지 모르겠군요.
>> 아시는분 답변 부탁드립니다.
>>
>> 두번째 질문입니다.
>> 위와 유사한 질문인데, 위와같이 패스워드를 주었으면
>> psql ctums하면 패스워드를 물어 봐야 하는것 아닌지요?
>> psql과 psql ctums를 하면 무조건 접속이 됩니다.
>> 단지 postgres 계정으로 createdb ctums하고 createuser ctums를 했습니다.
>> 무슨 문제가 될 소지가 있는지?
>> 좋은 방법을 알고 계신 고수님들 부탁드립니다.
>> 이것 역시 아님 데몬을 다시 띄우면 해결 되나요?
>> 지금까지 읽어주신 모든분께 감사드립니다.
|