0%

Spring Boot에서 MongoDB 연결 시 Authentication failed 발생에 관하여

에러…너의 이름은? Command failed with error 18: ‘Authentication failed.’ on server….

아마 저와같이 초보 개발자들이 많이 접할 문제일 것 같습니다.
서버에 MongoDB 환경을 구축 후 Spring-Boot쪽에서 의존성을 추가 후 접속 정보를 연결하여 접속을 해보면 스프링 로그에서 아래와 같은 로그가 나오게 됩니다. (약간의 보안 때문에 일부 정보는 수정하였습니다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='meme', source='ttp_dev', password=<hidden>, mechanismProperties={}}
at com.mongodb.connection.SaslAuthenticator.wrapInMongoSecurityException(SaslAuthenticator.java:157)
at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:37)
at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:66)
at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:44)
at com.mongodb.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:162)
at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:44)
at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32)
at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:109)
at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:46)
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:116)
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server targetServer:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }
at com.mongodb.connection.CommandHelper.createCommandFailureException(CommandHelper.java:170)
at com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.java:123)
at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32)
at com.mongodb.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:117)
at com.mongodb.connection.SaslAuthenticator.access$000(SaslAuthenticator.java:37)
at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:50)
... 9 common frames omitted

위 로그에서 가장 눈에 띄는 부분은 이 부분입니다.

Caused by: com.mongodb.MongoCommandException: Command failed with error 18: ‘Authentication failed.’ on server targetServer:27017. The full response is { “ok” : 0.0, “errmsg” : “Authentication failed.”, “code” : 18, “codeName” : “AuthenticationFailed” }

이 부분은 MongoDB의 인증에 실패하여 발생하였다는 것을 대략 알 수 있습니다.
사실 이것을 구글링을 해보다가 제대로 검색을 안해서 약간의 삽질을 하였습니다…

MongoDB의 설정 중 authorization이 활성화 되어 있고

1
2
security:
authorization: 'enabled'

관리하는 계정이 존재할 경우 아래와 같이 처리합니다.


How to?

먼저 간단한 수행 정보는 아래와 같습니다.

  • Spring Boot : 1.5.8.RELEASE
  • MongoDB : 3.6.3
  • 의존성 : org.springframework.boot:spring-boot-starter-data-mongodb

그리고 저는 yml 구성을 사용하였습니다.

1
2
3
4
5
6
7
8
9
spring:
data:
mongodb:
host: targetServer
port: 27017
authentication-database: admin
database: targetDB
username: admin
password: yourpw

여기서 저 authentication-database 정보를 적어주는게 중요합니다.
아직 사용한지 얼마 안되서 정확한 것은 아니지만 MongoDB에 인증 정보를 입력하였을 경우 해당 인증을 처리할 db 명을 적는 곳으로 대부분 admin으로 처리합니다.
그 외에는 자신에게 맞는 정보를 작성하면 됩니다.


결론

**’Authentication failed.’**의 경우 이 문제 때문에 100% 발생하는 것은 아니고 다른 사유들도 있지만, 제가 검색해 봤을 때는 대부분 저 authentication-database 정보가 누락하여 발생하였습니다.

지금은 처음 접해보는 것이라 정보가 부족하지만 조금씩 해보면서 정보를 업데이트 할 예정입니다.

감사합니다.