Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 4개 있습니다.)

네트워크 공유 폴더(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

비밀번호

댓글 작성자
 




1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13323정성태4/16/20234149개발 환경 구성: 677. Octave에서 Excel read/write를 위한 io 패키지 설치
13322정성태4/15/20234946VS.NET IDE: 182. Visual Studio - 32비트로만 빌드된 ActiveX와 작업해야 한다면?
13321정성태4/14/20233742개발 환경 구성: 676. WSL/Linux Octave - Python 스크립트 연동
13320정성태4/13/20233746개발 환경 구성: 675. Windows Octave 8.1.0 - Python 스크립트 연동
13319정성태4/12/20234202개발 환경 구성: 674. WSL 2 환경에서 GNU Octave 설치
13318정성태4/11/20234011개발 환경 구성: 673. JetBrains IDE에서 "Squash Commits..." 메뉴가 비활성화된 경우
13317정성태4/11/20234168오류 유형: 855. WSL 2 Ubuntu 20.04 - error: cannot communicate with server: Post http://localhost/v2/snaps/...
13316정성태4/10/20233495오류 유형: 854. docker-compose 시 "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)" 오류 발생
13315정성태4/10/20233673Windows: 245. Win32 - 시간 만료를 갖는 컨텍스트 메뉴와 윈도우 메시지의 영역별 정의파일 다운로드1
13314정성태4/9/20233747개발 환경 구성: 672. DosBox를 이용한 Turbo C, Windows 3.1 설치
13313정성태4/9/20233843개발 환경 구성: 671. Hyper-V VM에 Turbo C 2.0 설치 [2]
13312정성태4/8/20233825Windows: 244. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (개선된 버전)파일 다운로드1
13311정성태4/7/20234322C/C++: 163. Visual Studio 2022 - DirectShow 예제 컴파일(WAV Dest)
13310정성태4/6/20233886C/C++: 162. Visual Studio - /NODEFAULTLIB 옵션 설정 후 수동으로 추가해야 할 library
13309정성태4/5/20234056.NET Framework: 2107. .NET 6+ FileStream의 구조 변화
13308정성태4/4/20233945스크립트: 47. 파이썬의 time.time() 실숫값을 GoLang / C#에서 사용하는 방법
13307정성태4/4/20233732.NET Framework: 2106. C# - .NET Core/5+ 환경의 Windows Forms 응용 프로그램에서 HINSTANCE 구하는 방법
13306정성태4/3/20233570Windows: 243. Win32 - 윈도우(cbWndExtra) 및 윈도우 클래스(cbClsExtra) 저장소 사용 방법
13305정성태4/1/20233915Windows: 242. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (쉬운 버전)파일 다운로드1
13304정성태3/31/20234279VS.NET IDE: 181. Visual Studio - C/C++ 프로젝트에 application manifest 적용하는 방법
13303정성태3/30/20233590Windows: 241. 환경 변수 %PATH%에 DLL을 찾는 규칙
13302정성태3/30/20234220Windows: 240. RDP 환경에서 바뀌는 %TEMP% 디렉터리 경로
13301정성태3/29/20234335Windows: 239. C/C++ - Windows 10 Version 1607부터 지원하는 /DEPENDENTLOADFLAG 옵션파일 다운로드1
13300정성태3/28/20233961Windows: 238. Win32 - Modal UI 창에 올바른 Owner(HWND)를 설정해야 하는 이유
13299정성태3/27/20233737Windows: 237. Win32 - 모든 메시지 루프를 탈출하는 WM_QUIT 메시지
13298정성태3/27/20233682Windows: 236. Win32 - MessageBeep 소리가 안 들린다면?
1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...