Microsoft MVP성태의 닷넷 이야기
글쓴 사람
홈페이지
첨부 파일
 

네트워크 공유 폴더(net use)에 대한 인증 정보는 언제까지 유효할까요?

일단, 인증 정보는 네트워크 공유 폴더 연결 시 "Remember my credentials" 옵션을 체크하는 경우 윈도우에 저장됩니다.

net_use_cred_0.png

따라서 컴퓨터가 재부팅 후에도 인증 정보를 유지하고 싶다면 저 옵션을 사용하거나, 또는 "Control Panel\All Control Panel Items\Credential Manager"을 이용해 "Widnows Credentials"로 인증 정보를 직접 관리할 수 있습니다.

net_use_cred_1.png

참고로 명령행에서도 "rundll32.exe keymgr.dll, KRShowKeyMgr"를 수행하면 "Credential Manager"에 저장된 "Windows Credentials" 목록만을 편집하는 것이 가능하고, 순수 콘솔 명령어로 "cmdkey.exe"를 이용해 "/list", "/add", "/delete" 등의 명령어로도 관리할 수 있습니다.




그렇다면, "Windows Credentials"에 저장하지 않은 네트워크 드라이브로 연결하는 경우라면 어떻게 될까요?

명령행 창을 열어 다음과 같이 (예를 들어 192.168.100.25로) 네크워크 드라이브를 연결하면,

C:\Temp> net use \\192.168.100.25\c$ /USER:"testad\testuser"
Enter the password for 'testad\testuser' to connect to '192.168.100.25':
The command completed successfully.

보는 바와 같이 최초 접근 시에는 인증 정보를 요구하게 됩니다. 일단, 이렇게 한번 연결되면 다른 명령행 창(또는, 다른 EXE)에서도 해당 네트워크 드라이브로 재인증 없이 연결할 수 있습니다.

C:\Temp> net use \\192.168.100.25\c$ /USER:"testad\testuser"
Local name
Remote name       \\192.168.100.25\c$
Resource type     Disk
Status            OK
# Opens           0
# Connections     1
The command completed successfully.

인증 정보가 내부에 캐시되므로 컴퓨터를 재부팅하기 전까지는 유효한데 이때의 캐시 연결 정보를 PowerShell의 "Get-SmbConnection"으로 볼 수 있습니다.

PS C:\Temp> get-smbconnection

ServerName   ShareName UserName         Credential              Dialect NumOpens
----------   --------- --------         ----------              ------- --------
192.168.100.25 c$      thispc\testuser  testad\testuser 2.0.2   4

또한 대상 컴퓨터 측에서는 "Computer Management"의 "Shared Folders" / "Sessions"를 통해 네트워크 드라이브로 연결된 세션을 확인할 수 있습니다.

net_use_cred_2.png

만약, 대상 컴퓨터 측에서 위의 연결 항목을 선택하고 우 클릭 메뉴를 통해 "Close Session"을 하면 클라이언트 측에서도 연결이 끊기게 됩니다.

C:\Temp> net use \\192.168.100.25\c$ /USER:"testad\testuser"
Local name
Remote name       \\192.168.100.25\c$
Resource type     Disk
Status            Disconnected
# Opens           0
# Connections     1
The command completed successfully.

하지만, 연결이 끊긴 것일 뿐 인증 정보 캐시는 여전히 유효하므로 다시 "net use ..." 명령어를 수행하면 인증 정보 없이 잘 연결됩니다. 만약, 캐시된 인증 정보를 삭제하고 싶다면 "/delete" 옵션을 사용할 수 있습니다.

C:\Temp> net use /delete \\192.168.100.25\c$
\\192.168.100.25\c$ was deleted successfully.

문제는, 저렇게 인증 정보를 없앴어도 약 10초 내에 다시 "net use ..."로 연결하면 인증 없이 정상적으로 연결된다는 것입니다. 실제로 "net use /delete" 수행 후 10초 정도까지는 Get-SmbConnection 명령으로 192.168.100.25에 대한 연결이 살아있는 것을 확인할 수 있습니다. 물론, 10초 정도 후에 Get-SmbConnection 명령으로 확인이 안 되는 시점부터는 "net use ..."로 연결 시도를 하면 그때부터는 인증 정보를 묻게 됩니다.




한 가지 재미있는 점이라면, "net use"로 연결한 정보의 캐시가 같은 로그인 환경에서도 "관리자" 권한의 문맥과, "일반 사용자" 권한의 문맥이 따로 적용된다는 것입니다.

일례로, cmd.exe 창을 일반 사용자 권한으로 열고 net use \\192.168.100.25\c$ /USER:"testad\testuser"로 연결해 인증을 했다면, 이후 "관리자" 권한으로 cmd.exe 창을 띄워 다시 "net use \\192.168.100.25\c$ /USER:"testad\testuser"로 연결하면 비밀번호 인증을 다시 해야 합니다.

인증 정보의 캐시 삭제도 마찬가지입니다. "관리자 권한"의 창에서 "net use /delete \\192.168.100.25\c$"를 했다면 이것은 관리자 권한의 문맥에만 유효하므로 여전히 "일반 사용자" 권한의 cmd.exe에서는 "net use \\192.168.100.25\c$ /USER:"testad\testuser"로 연결할 때 인증을 묻지 않습니다. 따라서 이런 경우에는 2개의 문맥에서 모두 "net use /delete ..."를 수행해야 깨끗하게 인증 정보가 삭제됩니다.




그건 그렇고 왜 10초 내에는 인증 정보를 다시 묻지 않는 걸까요? 다시 말해 Get-SmbConnection으로 캐시 정보가 없어지는 것이 왜 10초일까요?

이것은, 네트워크 연결에 사용하는 TCP 연결이 net use를 사용한 cmd.exe(또는 사용자의 exe)에 속한 소켓으로 관리 되지 않기 때문입니다. 확인을 위해 netstat를 이용하면,

# IPv6를 이용한 445 연결인 경우에는 findstr의 IP 문자열을 IPv6 주소로 바꿔야 함

C:\temp> netstat -ano | findstr 192.168.100.25
  TCP    192.168.100.25:38058  192.168.100.25:445  ESTABLISHED     4

해당 소켓 연결을 유지하고 있는 프로세스의 ID가 4번임을 알 수 있고 이것은 작업 관리자에서 "SYSTEM"으로 보이는 프로세스입니다. 그러고 보니, 이와 비슷하게 SYSTEM이 관리하는 TCP 소켓을 예전에도 소개한 적이 있습니다.

OWIN 웹 서버(EXE)를 IIS에서 호스팅하는 방법 - HttpPlatformHandler (Reverse Proxy)
; https://www.sysnet.pe.kr/2/0/11435

IIS의 80 포트를 공유하는 응용 프로그램 만드는 방법
; https://www.sysnet.pe.kr/2/0/1555

SYSTEM 프로세스는 net use 인증 정보가 "net use /delete ..."로 삭제되면 (잠시 후에 설명할 "# Open Files"가 없는 경우) 10초 정도의 시간이 지난 후에 TCP 소켓을 정리합니다. 즉, 그 시간 동안 다시 "net use ..."로 연결을 시도하면 아직 닫히지 않은 TCP 소켓을 연장해 사용하기 때문에 재인증을 묻지 않는 것입니다.




인증 정보에 대한 캐시 문제가 "윈도우 탐색기"와 엮이게 되면 문제가 더욱 복잡해집니다. 명령행과는 달리, 윈도우 탐색기는 공유 폴더를 이동하는 동안 다수의 파일을 열게 됩니다. 대상 컴퓨터의 "Computer Management" MMC에서 "Shared Folder" / "Sessions"의 연결 목록에 보면 "# Open Files"에서 그 상황을 확인할 수 있습니다.

그렇다면 클라이언트 측에서 탐색기를 이용해 "\\192.168.100.25\c$"으로 연결한 후, cmd.exe 창에서 "net use /delete ..."로 인증 정보를 삭제하면 어떻게 될까요? 이런 경우 상황에 따라 다릅니다. 탐색기가 공유 폴더 연결 후 폴더의 내용을 보여주면서 몇몇 특수 파일을 열게 되는데 이로 인해 "# Open Files"가 늘어나게 됩니다.

문제는, "# Open Files"가 정리되지 않으면 SYSTEM 프로세스는 TCP 445번 소켓을 절대 닫지 않는다는 것입니다. 즉 "net use /delete ..."가 되었음에도 SMB 연결 소켓은 여전히 열려 있으므로 해당 탐색기가 살아 있는 한 이후의 어떤 프로세스에서도 "net use ..."를 이용해 네트워크 드라이브를 연결하는 경우 인증 정보를 묻지 않게 되는 것입니다.

따라서, 탐색기로 공유 폴더를 연결했다면 "net use /delete ..."와 함께 반드시 그 탐색기를 닫아줘야 합니다. (그리곤 10초 정도 기다려야 합니다.) 물론 탐색기가 열고 있는 파일이 닫혔다면 탐색기를 종료하지 않아도 되긴 하는데 그런 경우가 많지 않습니다.




마지막으로, 네트워크 공유 폴더를 재연결 시 인증 정보를 다시 묻지 않는 것은 SYSTEM 프로세스에서 관리하는 TCP 소켓을 공유하기 때문만은 아닙니다. 일례로, cmd.exe에서 "net use ..."로 연결 후 해당 exe 창을 닫고 대상 PC 측에서는 "Computer Management" MMC를 이용해 세션을 닫아버리면 SYSTEM 프로세스가 보유한 소켓이 얼마 후 삭제가 됩니다.

하지만 그 상태에서 다시 "net use ..."를 사용하거나 윈도우 탐색기로 공유 폴더를 접근하면 인증 정보 없이 들어가게 됩니다. 따라서, 반드시 "net use /delete ..."로 삭제하거나 재부팅을 해서 캐시된 인증 정보를 없애야만 인증을 다시 거칠 수 있습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]





[최초 등록일: ]
[최종 수정일: 4/9/2019 ]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer@outlook.com

비밀번호

댓글 쓴 사람
 




1  2  3  4  5  6  7  [8]  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
12081정성태12/16/2019668개발 환경 구성: 465. 로컬 PC에서 개발 중인 ASP.NET Core 웹 응용 프로그램을 다른 PC에서도 접근하는 방법 [1]
12080정성태12/16/2019851.NET Framework: 870. C# - 프로세스의 모든 핸들을 열람
12079정성태12/13/2019631오류 유형: 584. 원격 데스크탑(rdp) 환경에서 다중 또는 고용량 파일 복사 시 "Unspecified error" 오류 발생
12078정성태12/13/20191002Linux: 26. .NET Core 응용 프로그램을 위한 메모리 덤프 방법 [1]
12077정성태12/13/2019716Linux: 25. 자주 실행할 명령어 또는 초기 환경을 "~/.bashrc" 파일에 등록
12076정성태12/17/2019817디버깅 기술: 142. Linux - lldb 환경에서 sos 확장 명령어를 이용한 닷넷 프로세스 디버깅 - 배포 방법에 따른 차이
12075정성태12/18/2019905디버깅 기술: 141. Linux - lldb 환경에서 sos 확장 명령어를 이용한 닷넷 프로세스 디버깅
12074정성태12/11/2019585디버깅 기술: 140. windbg/Visual Studio - 값이 변경된 경우를 위한 정지점(BP) 설정(Data Breakpoint)
12073정성태12/10/20191043Linux: 24. Linux/C# - 실행 파일이 아닌 스크립트 형식의 명령어를 Process.Start로 실행하는 방법
12072정성태12/9/2019418오류 유형: 583. iisreset 수행 시 "No such interface supported" 오류
12071정성태12/9/2019660오류 유형: 582. 리눅스 디스크 공간 부족 및 safemode 부팅 방법
12070정성태12/9/20191182오류 유형: 581. resize2fs: Bad magic number in super-block while trying to open /dev/.../root
12069정성태12/19/2019825디버깅 기술: 139. windbg - x64 덤프 분석 시 메서드의 인자 또는 로컬 변수의 값을 확인하는 방법
12068정성태11/28/20191332디버깅 기술: 138. windbg와 Win32 API로 알아보는 Windows Heap 정보 분석 [2]파일 다운로드2
12067정성태11/27/2019828디버깅 기술: 137. 실제 사례를 통해 Debug Diagnostics 도구가 생성한 닷넷 웹 응용 프로그램의 성능 장애 보고서 설명 [1]파일 다운로드1
12066정성태11/27/2019584디버깅 기술: 136. windbg - C# PInvoke 호출 시 마샬링을 담당하는 함수 분석 - OracleCommand.ExecuteReader에서 OpsSql.Prepare2 PInvoke 호출 분석
12065정성태11/25/2019732디버깅 기술: 135. windbg - C# PInvoke 호출 시 마샬링을 담당하는 함수 분석파일 다운로드1
12064정성태11/25/20191047오류 유형: 580. HTTP Error 500.0/500.33 - ANCM In-Process Handler Load Failure
12063정성태11/21/2019766디버깅 기술: 134. windbg - RtlReportCriticalFailure로부터 parameters 정보 찾는 방법
12062정성태12/20/2019636디버깅 기술: 133. windbg - CoTaskMemFree/FreeCoTaskMem에서 발생한 덤프 분석 사례 - 두 번째 이야기
12061정성태11/20/2019719Windows: 165. CoTaskMemAlloc/CoTaskMemFree과 윈도우 Heap의 관계
12060정성태11/21/2019800디버깅 기술: 132. windbg/Visual Studio - HeapFree x64의 동작 분석
12059정성태11/20/2019731디버깅 기술: 131. windbg/Visual Studio - HeapFree x86의 동작 분석
12058정성태11/19/2019708디버깅 기술: 130. windbg - CoTaskMemFree/FreeCoTaskMem에서 발생한 덤프 분석 사례
12057정성태11/18/2019502오류 유형: 579. Visual Studio - Memory 창에서 유효한 주소 영역임에도 "Unable to evaluate the expression." 오류 출력
12056정성태11/18/2019928개발 환경 구성: 464. "Microsoft Visual Studio Installer Projects" 프로젝트로 EXE 서명 및 MSI 파일 서명 방법파일 다운로드1
1  2  3  4  5  6  7  [8]  9  10  11  12  13  14  15  ...