Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 3개 있습니다.)
(시리즈 글이 2개 있습니다.)
Windows: 159. 네트워크 공유 폴더(net use)에 대한 인증 정보는 언제까지 유효할까요?
; https://www.sysnet.pe.kr/2/0/11866

Windows: 252. 권한 상승 전/후 따로 관리되는 공유 네트워크 드라이브 정보
; https://www.sysnet.pe.kr/2/0/13411




네트워크 공유 폴더(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 ..."로 삭제하거나 재부팅을 해서 캐시된 인증 정보를 없애야만 인증을 다시 거칠 수 있습니다.




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 9/11/2023]

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

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1755정성태9/22/201434258오류 유형: 241. Unity Web Player를 설치해도 여전히 설치하라는 화면이 나오는 경우 [4]
1754정성태9/22/201424589VC++: 80. 내 컴퓨터에서 C++ AMP 코드가 실행이 될까요? [1]
1753정성태9/22/201420600오류 유형: 240. Lync로 세미나 참여 시 소리만 들리지 않는 경우 [1]
1752정성태9/21/201441060Windows: 100. 윈도우 8 - RDP 연결을 이용해 VNC처럼 사용자 로그온 화면을 공유하는 방법 [5]
1751정성태9/20/201438924.NET Framework: 464. 프로세스 간 통신 시 소켓 필요 없이 간단하게 Pipe를 열어 통신하는 방법 [1]파일 다운로드1
1750정성태9/20/201423827.NET Framework: 463. PInvoke 호출을 이용한 비동기 파일 작업파일 다운로드1
1749정성태9/20/201423730.NET Framework: 462. 커널 객체를 위한 null DACL 생성 방법파일 다운로드1
1748정성태9/19/201425379개발 환경 구성: 238. [Synergy] 여러 컴퓨터에서 키보드, 마우스 공유
1747정성태9/19/201428398오류 유형: 239. psexec 실행 오류 - The system cannot find the file specified.
1746정성태9/18/201426079.NET Framework: 461. .NET EXE 파일을 닷넷 프레임워크 버전에 상관없이 실행할 수 있을까요? - 두 번째 이야기 [6]파일 다운로드1
1745정성태9/17/201423032개발 환경 구성: 237. 리눅스 Integration Services 버전 업그레이드 하는 방법 [1]
1744정성태9/17/201431041.NET Framework: 460. GetTickCount / GetTickCount64와 0x7FFE0000 주솟값 [4]파일 다운로드1
1743정성태9/16/201420983오류 유형: 238. 설치 오류 - Failed to get size of pseudo bundle
1742정성태8/27/201426953개발 환경 구성: 236. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법 [2]
1741정성태8/26/201421329.NET Framework: 459. GetModuleHandleEx로 알아보는 .NET 메서드의 DLL 모듈 관계파일 다운로드1
1740정성태8/25/201432498.NET Framework: 458. 닷넷 GC가 순환 참조를 해제할 수 있을까요? [2]파일 다운로드1
1739정성태8/24/201426497.NET Framework: 457. 교착상태(Dead-lock) 해결 방법 - Lock Leveling [2]파일 다운로드1
1738정성태8/23/201422041.NET Framework: 456. C# - CAS를 이용한 Lock 래퍼 클래스파일 다운로드1
1737정성태8/20/201419742VS.NET IDE: 93. Visual Studio 2013 동기화 문제
1736정성태8/19/201425565VC++: 79. [부연] CAS Lock 알고리즘은 과연 빠른가? [2]파일 다운로드1
1735정성태8/19/201418151.NET Framework: 455. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 두 번째 이야기
1734정성태8/13/201419806오류 유형: 237. Windows Media Player cannot access the file. The file might be in use, you might not have access to the computer where the file is stored, or your proxy settings might not be correct.
1733정성태8/13/201426332.NET Framework: 454. EmptyWorkingSet Win32 API를 사용하는 C# 예제파일 다운로드1
1732정성태8/13/201434458Windows: 99. INetCache 폴더가 다르게 보이는 이유
1731정성태8/11/201427055개발 환경 구성: 235. 점(.)으로 시작하는 파일명을 탐색기에서 만드는 방법
1730정성태8/11/201422147개발 환경 구성: 234. Royal TS의 터미널(Terminal) 연결에서 한글이 깨지는 현상 해결 방법
... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...