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)
11981정성태7/7/20191107Math: 64. C# - 3층 구조의 신경망(분류)파일 다운로드1
11980정성태7/7/20194456개발 환경 구성: 450. Visual Studio Code의 Java 확장을 이용한 간단한 프로젝트 구축파일 다운로드1
11979정성태7/8/20191267개발 환경 구성: 449. TFS에서 gitlab/github등의 git 서버로 마이그레이션하는 방법
11978정성태7/6/20191201Windows: 161. 계정 정보가 동일하지 않은 PC 간의 인증을 수행하는 방법 [1]
11977정성태7/6/20191872오류 유형: 554. git push - error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large
11976정성태7/4/20191188오류 유형: 553. (잘못 인증 한 후) 원격 git repo 재인증 시 "remote: HTTP Basic: Access denied" 오류 발생
11975정성태7/4/20192849개발 환경 구성: 448. Visual Studio Code에서 콘솔 응용 프로그램 개발 시 "입력"받는 방법
11974정성태7/4/20191754Linux: 22. "Visual Studio Code + Remote Development"로 윈도우 환경에서 리눅스(CentOS 7) C/C++ 개발
11973정성태7/4/20191254Linux: 21. 리눅스에서 공유 라이브러리가 로드되지 않는다면?
11972정성태7/3/20191398.NET Framework: 847. JAVA와 .NET 간의 AES 암호화 연동파일 다운로드1
11971정성태7/3/20191291개발 환경 구성: 447. Visual Studio Code에서 OpenCvSharp 개발 환경 구성
11970정성태7/2/20191139오류 유형: 552. 웹 브라우저에서 파일 다운로드 후 "Running security scan"이 끝나지 않는 문제
11969정성태7/7/20191084Math: 63. C# - 3층 구조의 신경망파일 다운로드1
11968정성태7/1/20192598오류 유형: 551. Visual Studio Code에서 Remote-SSH 연결 시 "Opening Remote..." 단계에서 진행되지 않는 문제 [1]
11967정성태7/1/20191074개발 환경 구성: 446. Synology NAS를 Windows 10에서 iSCSI로 연결하는 방법
11966정성태6/30/20191099Math: 62. 활성화 함수에 따른 뉴런의 출력을 그리드 맵으로 시각화파일 다운로드1
11965정성태6/30/20191158.NET Framework: 846. C# - 2차원 배열을 1차원 배열로 나열하는 확장 메서드파일 다운로드1
11964정성태6/30/20191452Linux: 20. C# - Linux에서의 Named Pipe를 이용한 통신
11963정성태6/29/20191367Linux: 19. C# - .NET Core Unix Domain Socket 사용 예제
11962정성태6/27/2019869Math: 61. C# - 로지스틱 회귀를 이용한 선형분리 불가능 문제의 분류파일 다운로드1
11961정성태6/27/2019724Graphics: 37. C# - PLplot - 출력 모음(Family File Output)
11960정성태6/27/20191054Graphics: 36. C# - PLplot의 16색 이상을 표현하는 방법과 subpage를 이용한 그리드 맵 표현
11959정성태6/27/2019819Graphics: 35. matplotlib와 PLplot의 한글 처리
11958정성태6/25/20192129Linux: 18. C# - .NET Core Console로 리눅스 daemon 프로그램 만드는 방법 [1]
11957정성태6/24/20192424Windows: 160. WMI 쿼리를 명령행에서 간단하게 수행하는 wmic.exe [1]
11956정성태6/24/20191699Linux: 17. CentOS 7에서 .NET Core Web App 실행 환경 구성 [1]
1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...