본문 바로가기

개발/트러블 슈팅

mongodb connection, authrization error를 만나다

반응형

mongodb 교육중 재미있는 에러를 만났다.

 

back과 front가 만들어진 서비스에서 back mongo db를 connect 하는 도중 db는 기록되었다고 하나 compass와 db 파일을 가니 생성되지 않는 경우였다.

 

그래서 db의 path가 잘못된 것으로 판단하여 열심히 setting 을 변경하는 도중 이 부분에는 에러가 없다는 것을 깨달았다.

 

해보았던 것

  1. dbpath 변경
  2. db껏다키기 ⇒ brew services restart mongodb-community
  3. mongod.conf authrization 설정
  4. db user 권한 부여 & 새로 만들기

구글링 끝에 여러 시도를 해보았고 문제가 없다고 판단하여 backend 쪽에 connection 부분의 코드를 뜯어보기 시작했다.

 

여기서 문제를 해결하였다.

 

첫 코드에서는

mongoose.connect('mongodb://localhost:27017/marketboard')

로 연결을 시도하였다.

 

이렇게 진행했을 때는 생성이 되었다고는 log가 찍히나 제대로 동작하지 않는다.

 

교육에서는 mongodb를 새로 설치하였지만 나는 기존에 사용했보았고 내 이름으로 user를 생성하고 root 권한을 부여한 적 있었다. 이를 위해 .env에 내 db아이디와 패스워드를 추가하였다.

 

mongoose.connect(`mongodb://${DB_ID}:${DB_PASSWORD}localhost:27017/marketboard`)

 

하지만

 

 

에러가 발생한다.

 

root 권한을 준 user에게 웬 authentication 에러가 발생하는 것인가 흠.. 여기서 미궁에 빠졌다. 열심히 구글링 하던 중 노드 교과서 에서 mongodb connect 부분을 다시 보았는데 거기서는 연결을

 

mongoose.connect(`mongodb://${id}:${pwd}@localhost:27017/admin`, {
	dbName: 'nodejs'
})

을 통해 해결하였다. 위 코드는 접속을 시도하는 db는 addmin이지만 실제로 사용할 db는 nodejs 를 뜻한다. 이 코드를 marketboard에 적용하니 원하는 대로 동작을 하였다.

 

해결은 했지만 많은 의문사항을 남겼다. 실제로 다양한 시도를 해보았는데 admin을 제거하고 진행해도 진행이 된다. 하지만 다른 db를 넣고 하면 되질 않는 것을 보아 빈칸으로 접근시 default 값이 admin으로 연결될 확률이 높다.

 

이 사실을 확인하고 싶어 좀 더 구글링을 해보았는데

 

dbName - Specifies which database to connect to and overrides any database specified in the connection string. This is useful if you are unable to specify a default database in the connection string like with some

 

dbName은 default db를 명시할 수 없을때 dbName을 통해 덮어씌우는 방식으로 명시해주므로 유리하게 사용할 수 있다. 하지만 다른 db를 넣고 덮어씌우는 방식으로 진행하면 마찬가지로 auth 에러가 발생한다. 아무래도 admin에 좀 더 특별한 권한이 존재하는 것으로 정리하고 넘어가도록 하자.

 

위 내용을 정리하던 중 다른 option을 확인하였는데 authSource 옵션을 통해서도 해당 에러 디버깅이 가능하다. authSource는

 

authSource - The database to use when authenticating with user and pass. In MongoDB, users are scoped to a database. If you are getting an unexpected login failure, you may need to set this option.

 

db에 스코프가 생겨 로그인이 실패할 때 사용하는 옵션으로 authSource를 admin으로 주면 url뒤에 admin 옵션을 준 것 처럼 작동한다.

auth admin의 권한을 부여하여 접근을 용이하게 할때 사용한다.

 

나와 같은 에러를 만났을 분이 1분이라도 있을 거 같아 해당 내용을 정리해본다.

 

결론 : mongodb연결시 root 권한을 준 새로운 사용자를 만들었었다. 그러니 default root로 별다른 설정없이 db를 생성하려 했으나 auth에러가 발생하였고 권한을 부여한 새로운 사용자로 로그인을 하여 admin의 권한을 부여하니 해결할 수 있었다.

 

(root를 내가 없앴나.. 과거의 나.. 그게 아니라면 권한 부여시 그 이후로는 로그인과 db마다 권한 부여가 필요한듯)

 

참고 레퍼런스

mongo docs connection part

Why use dbName to solve

mongo auth

반응형