매번 리눅스 서버에 접속할 때마다 비밀번호를 입력하는 것은 생각보다 큰 스트레스입니다. 특히 VS Code로 원격 개발을 하면서 하루에도 수십 번씩 재접속해야 하는 상황이라면 더더욱 그렇죠. 이번 포스팅에서는 Windows 로컬 환경에서 Linux 원격 서버로 SSH Key 인증을 설정하여, 비밀번호 없이 안전하고 편리하게 자동 로그인하는 방법을 단계별로 상세히 정리했습니다.
SSH Key 인증은 비밀번호 대신 암호화 키 쌍으로 신원을 확인하는 방식입니다. 이는 비대칭 암호화(Asymmetric Cryptography) 기술을 기반으로 하며, 두 개의 수학적으로 연결된 키로 구성됩니다.
구성 요소:
Private Key (비밀키)
id_rsa
, id_ed25519
C:\Users\<사용자명>\.ssh\
Public Key (공개키)
id_rsa.pub
, id_ed25519.pub
~/.ssh/authorized_keys
파일 내부https://www.adsmurai.com/en/articles/how-to-generate-secure-ssh-keys
authorized_keys
에서 해당 사용자의 공개키 검색이 방식은 중간자 공격(Man-in-the-Middle Attack)에 강하고, 무차별 대입 공격(Brute Force)으로부터도 안전합니다.
강력한 암호화 강도
피싱 방지
자동화 친화적
개발 생산성 향상
세밀한 접근 제어
Ed25519 (권장)
-b
옵션 불필요# Ed25519 키 생성 (권장)
ssh-keygen -t ed25519 -C "your_email@example.com"
RSA 4096bit (호환성 우선 시)
# RSA 4096bit 키 생성
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
RSA -b
옵션의 의미
-b
는 비트(bit) 길이를 지정하는 옵션입니다키 길이 | 보안 수준 | 권장 사항 |
---|---|---|
2048bit | 기본 | 최소 요구사항 |
4096bit | 강화 | 권장 설정 |
8192bit | 매우 강함 | 과도함 (성능 저하) |
Passphrase 사용
엄격한 파일 권한
경로/파일 | Windows | Linux | 설명 |
---|---|---|---|
.ssh 디렉토리 | 현재 사용자만 | 700 | 소유자만 읽기/쓰기/실행 |
비밀키 파일 | 현재 사용자만 | 600 | 소유자만 읽기/쓰기 |
공개키 파일 | 제한 없음 | 644 | 모두 읽기, 소유자만 쓰기 |
authorized_keys | - | 600 | 소유자만 읽기/쓰기 |
키 격리 전략
~/.ssh/config
에서 호스트별로 다른 키 지정 가능OpenSSH 클라이언트 확인
Windows 10(1809 이상) 및 Windows 11에는 OpenSSH 클라이언트가 기본 내장되어 있습니다. PowerShell에서 확인:
# OpenSSH 설치 확인
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'
# 출력 예시:
# Name : OpenSSH.Client~~~~0.0.1.0
# State : Installed
만약 설치되지 않았다면:
# OpenSSH 클라이언트 설치
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Step 1: PowerShell 실행
Win + X
→ "Windows PowerShell" 또는 "터미널" 선택Step 2: 키 생성 명령 실행
# Ed25519 키 생성 (권장)
ssh-keygen -t ed25519 -C "myemail@company.com"
또는 RSA 사용 시:
# RSA 4096bit 키 생성
ssh-keygen -t rsa -b 4096 -C "myemail@company.com"
옵션 설명:
-t
: 키 타입 지정 (ed25519 또는 rsa)-b
: 비트 길이 (RSA만 해당, Ed25519는 고정 256bit)-C
: 주석(Comment) 추가 - 보통 이메일 주소나 설명 입력Step 3: 대화형 프롬프트 응답
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\YourName/.ssh/id_ed25519):
C:\Users\<사용자명>\.ssh\id_ed25519
C:\Users\<사용자명>\.ssh\id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Step 4: 생성 완료 확인
Your identification has been saved in C:\Users\YourName/.ssh/id_ed25519.
Your public key has been saved in C:\Users\YourName/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:abcd1234... myemail@company.com
The key's randomart image is:
+--[ED25519 256]--+
| .o+ |
| . =.o |
| = B + |
...
생성된 파일 확인:
# .ssh 디렉토리 내용 확인
dir $env:USERPROFILE\.ssh
# 출력 예시:
# Mode LastWriteTime Length Name
# ---- ------------- ------ ----
# -a--- 2025-10-01 오전 9:30 464 id_ed25519
# -a--- 2025-10-01 오전 9:30 103 id_ed25519.pub
주석이 필요 없거나 나중에 추가하고 싶다면 -C
옵션 생략:
ssh-keygen -t ed25519
이 경우 공개키 마지막에 주석이 붙지 않거나 Windows 사용자명이 자동으로 표시됩니다.
Windows PowerShell에서 공개키 내용을 확인합니다:
# Ed25519 공개키 내용 출력
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
# RSA 사용 시
Get-Content $env:USERPROFILE\.ssh\id_rsa.pub
출력 예시:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJqL9Zv8... myemail@company.com
이 전체 문자열을 복사합니다 (Ctrl+C).
방법 1: 기존 비밀번호로 SSH 접속 후 등록
Windows PowerShell에서:
# Linux 서버에 접속 (비밀번호 입력 필요)
ssh ubuntu@192.168.1.100
Linux 서버 터미널에서:
# .ssh 디렉토리 생성 (이미 있으면 무시됨)
mkdir -p ~/.ssh
# 디렉토리 권한 설정
chmod 700 ~/.ssh
# authorized_keys 파일에 공개키 추가
cat >> ~/.ssh/authorized_keys
이제 커서가 입력 대기 상태로 변합니다.
Ctrl + D
눌러 입력 종료# 파일 권한 설정
chmod 600 ~/.ssh/authorized_keys
# 내용 확인
cat ~/.ssh/authorized_keys
방법 2: 원격 명령으로 한 번에 처리
Windows PowerShell에서 한 줄로 실행:
# 공개키를 서버로 전송하여 등록
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh ubuntu@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
이 명령은:
1. 로컬의 공개키 내용을 읽어서
2. SSH로 서버에 전송하며
3. 서버에서 .ssh
디렉토리 생성, 권한 설정, 공개키 추가를 자동 수행합니다
방법 3: SCP로 파일 전송 후 추가
# 공개키 파일을 서버로 복사
scp $env:USERPROFILE\.ssh\id_ed25519.pub ubuntu@192.168.1.100:~/temp_key.pub
Linux 서버에서:
# 전송된 파일을 authorized_keys에 추가
mkdir -p ~/.ssh
cat ~/temp_key.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
rm ~/temp_key.pub # 임시 파일 삭제
>
와 >>
의 차이: >
는 파일을 덮어쓰고, >>
는 파일 끝에 추가합니다. 기존 키가 있다면 반드시 >>
를 사용하세요..ssh
디렉토리와 authorized_keys
파일 권한이 너무 열려있으면 보안상 인증을 거부합니다.Step 1: Config 파일 생성/편집
VS Code에서:
1. F1
또는 Ctrl+Shift+P
로 명령 팔레트 열기
2. "Remote-SSH: Open SSH Configuration File..." 입력
3. C:\Users\<사용자명>\.ssh\config
선택
또는 PowerShell에서 직접:
# Config 파일을 VS Code로 열기
code $env:USERPROFILE\.ssh\config
Step 2: 호스트 설정 추가
다음 내용을 입력:
# 개발 서버 설정
Host dev-server
HostName 192.168.1.100
User ubuntu
IdentityFile C:\Users\YourName\.ssh\id_ed25519
AddKeysToAgent yes
IdentitiesOnly yes
ServerAliveInterval 60
ServerAliveCountMax 3
# 프로덕션 서버 설정 (다른 키 사용 예시)
Host prod-server
HostName 203.0.113.50
User admin
Port 2222
IdentityFile C:\Users\YourName\.ssh\id_rsa_production
AddKeysToAgent yes
IdentitiesOnly yes
설정 항목 상세 설명:
항목 | 필수 여부 | 설명 |
---|---|---|
Host | 필수 | 접속 시 사용할 별칭 (자유롭게 지정) |
HostName | 필수 | 실제 서버 IP 주소 또는 도메인 |
User | 필수 | 서버 로그인 사용자명 |
IdentityFile | 권장 | 사용할 비밀키 파일 경로 (절대 경로 권장) |
Port | 선택 | SSH 포트 (기본값 22, 변경 시 명시) |
AddKeysToAgent | 권장 | SSH Agent에 키 자동 추가 (yes 권장) |
IdentitiesOnly | 권장 | 지정한 키만 사용 (yes 권장) |
ServerAliveInterval | 선택 | 서버에 keepalive 신호 전송 간격(초) |
ServerAliveCountMax | 선택 | keepalive 실패 허용 횟수 |
경로 표기 주의사항:
\
) 또는 슬래시(/
) 모두 사용 가능"C:\Program Files\..."
~
는 Windows PowerShell SSH에서 지원하지만, 절대 경로 권장방법 1: 명령 팔레트 사용
F1
또는 Ctrl+Shift+P
dev-server
)방법 2: 좌측 사이드바 사용
성공 시 VS Code 좌측 하단 상태바에 다음과 같이 표시:
SSH: dev-server
이제 VS Code 터미널은 자동으로 Linux 서버 환경이 되며, 파일 탐색기도 서버의 파일 시스템을 보여줍니다.
포트 포워딩 설정
개발 서버의 웹 애플리케이션(예: 포트 8000)을 로컬에서 접근하고 싶다면:
Host dev-server
...
LocalForward 8000 localhost:8000
이제 로컬 브라우저에서 http://localhost:8000
접속 시 서버의 8000 포트로 연결됩니다.
ProxyJump를 통한 다단계 접속
Bastion 서버를 거쳐 내부 서버에 접속해야 하는 경우:
Host bastion
HostName 203.0.113.10
User ubuntu
IdentityFile C:\Users\YourName\.ssh\id_ed25519
Host internal-server
HostName 10.0.1.50
User ubuntu
ProxyJump bastion
IdentityFile C:\Users\YourName\.ssh\id_ed25519
Passphrase는 비밀키 파일 자체를 암호화하는 추가 보안 계층입니다.
장점:
단점:
SSH Agent는 비밀키를 메모리에 안전하게 캐싱하여, passphrase를 세션당 한 번만 입력하도록 하는 서비스입니다.
Step 1: SSH Agent 서비스 활성화
PowerShell을 관리자 권한으로 실행:
# SSH Agent 서비스 상태 확인
Get-Service ssh-agent
# 서비스 시작
Start-Service ssh-agent
# 시스템 부팅 시 자동 시작 설정
Set-Service -Name ssh-agent -StartupType Automatic
Step 2: 비밀키 등록
일반 사용자 권한 PowerShell에서:
# 비밀키를 SSH Agent에 추가
ssh-add $env:USERPROFILE\.ssh\id_ed25519
# Passphrase 설정 시 프롬프트 나타남
Enter passphrase for C:\Users\YourName/.ssh/id_ed25519:
# (passphrase 입력)
Identity added: C:\Users\YourName/.ssh/id_ed25519 (myemail@company.com)
Step 3: 등록된 키 확인
# 현재 Agent에 등록된 키 목록
ssh-add -l
# 출력 예시:
# 256 SHA256:abcd1234... myemail@company.com (ED25519)
~/.ssh/config
파일에 AddKeysToAgent yes
추가 시, VS Code 접속 시 자동으로 Agent에 키 등록:
Host dev-server
...
AddKeysToAgent yes
SSH Agent는 Windows 로그아웃 시까지 키를 메모리에 유지합니다. 보안을 위해 명시적으로 제거하려면:
# Agent에서 특정 키 제거
ssh-add -d $env:USERPROFILE\.ssh\id_ed25519
# Agent에서 모든 키 제거
ssh-add -D
증상:
ubuntu@192.168.1.100: Permission denied (publickey).
원인 및 해결:
공개키가 서버에 제대로 등록되지 않음
# Linux 서버에서 확인
cat ~/.ssh/authorized_keys
# 공개키 내용이 정확히 한 줄로 들어가 있는지 확인
서버 파일 권한 문제
# Linux 서버에서 권한 재설정
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
홈 디렉토리 권한 문제
# 홈 디렉토리는 다른 사용자가 쓰기 권한을 가지면 안 됨
chmod 755 ~
SELinux 컨텍스트 오류 (CentOS/RHEL)
restorecon -R -v ~/.ssh
증상 (Git Bash/WSL에서):
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'C:/Users/YourName/.ssh/id_ed25519' are too open.
원인:
Windows NTFS 파일 시스템과 Git Bash/WSL의 권한 해석 차이
해결:
Git Bash에서:
# 비밀키 파일 권한 변경
chmod 600 ~/.ssh/id_ed25519
WSL에서:
# Windows 파일시스템 권한 문제 해결
sudo chmod 600 /mnt/c/Users/YourName/.ssh/id_ed25519
PowerShell에서는 이 경고가 나타나지 않습니다 (Windows 자체 권한 시스템 사용).
증상:
"Setting up SSH Host dev-server: Downloading VS Code Server..." 에서 멈춤
원인 및 해결:
서버의 디스크 용량 부족
# Linux 서버에서 확인
df -h
# /home 파티션이 꽉 찼다면 정리 필요
방화벽/네트워크 문제
curl -I https://update.code.visualstudio.com
VS Code Server 캐시 삭제
# Linux 서버에서
rm -rf ~/.vscode-server
증상:
SSH Agent에 키를 추가했는데도 매번 passphrase 입력 요구
원인 및 해결:
SSH Agent가 실행 중인지 확인
Get-Service ssh-agent
# Status가 Running이 아니면 Start-Service ssh-agent
키가 Agent에 등록되었는지 확인
ssh-add -l
# "The agent has no identities." 출력 시 ssh-add로 재등록
Config 파일에 AddKeysToAgent 설정
Host *
AddKeysToAgent yes
증상:
Received disconnect from 192.168.1.100: Too many authentication failures
원인:
SSH 클라이언트가 여러 개의 키를 시도하다가 서버의 시도 횟수 제한 초과
해결:
Config 파일에 IdentitiesOnly yes
추가:
Host dev-server
...
IdentitiesOnly yes
이렇게 하면 지정한 키만 사용하고 다른 키는 시도하지 않습니다.
증상:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
원인:
서버 재설치, IP 재사용 등으로 호스트 키가 변경됨
해결:
# Windows에서 해당 호스트의 기록 삭제
ssh-keygen -R 192.168.1.100
# 또는 known_hosts 파일에서 직접 해당 줄 삭제
notepad $env:USERPROFILE\.ssh\known_hosts
# ===== 1. SSH Key 생성 =====
ssh-keygen -t ed25519 -C "myemail@company.com"
# Enter 3회 (기본 경로, passphrase 생략 시)
# ===== 2. SSH Agent 설정 (관리자 권한 PowerShell) =====
Start-Service ssh-agent
Set-Service -Name ssh-agent -StartupType Automatic
# ===== 3. SSH Agent에 키 등록 (일반 PowerShell) =====
ssh-add $env:USERPROFILE\.ssh\id_ed25519
# ===== 4. 공개키 내용 복사 =====
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | clip
# 또는 출력된 내용을 직접 복사
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
# ===== 5. VS Code Config 작성 =====
code $env:USERPROFILE\.ssh\config
# 아래 내용 입력:
Host my-linux-server
HostName 192.168.1.100
User ubuntu
IdentityFile C:\Users\YourName\.ssh\id_ed25519
AddKeysToAgent yes
IdentitiesOnly yes
ServerAliveInterval 60
# ===== 1. 비밀번호로 서버 접속 (최초 1회만) =====
ssh ubuntu@192.168.1.100
# ===== 2. .ssh 디렉토리 및 authorized_keys 설정 =====
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# ===== 3. 공개키 등록 =====
cat >> ~/.ssh/authorized_keys
# (Windows에서 복사한 공개키 붙여넣기)
# (Ctrl+D로 저장)
# ===== 4. 권한 설정 =====
chmod 600 ~/.ssh/authorized_keys
# ===== 5. 확인 및 접속 종료 =====
cat ~/.ssh/authorized_keys
exit
# ===== 1. 터미널에서 수동 접속 테스트 =====
ssh my-linux-server
# Passphrase 설정 시 한 번만 입력, 이후 자동
# ===== 2. VS Code에서 접속 =====
# F1 → "Remote-SSH: Connect to Host..." → my-linux-server 선택
단계 | Windows | Linux | 확인 사항 |
---|---|---|---|
키 생성 | ✅ | - | id_ed25519 , id_ed25519.pub 존재 |
Agent 실행 | ✅ | - | Get-Service ssh-agent → Running |
키 등록 | ✅ | - | ssh-add -l → 키 목록 출력 |
공개키 복사 | ✅ | - | 클립보드에 복사 완료 |
공개키 등록 | - | ✅ | authorized_keys 파일에 한 줄로 추가 |
권한 설정 | - | ✅ | .ssh → 700, authorized_keys → 600 |
Config 작성 | ✅ | - | Host, HostName, User, IdentityFile 확인 |
접속 테스트 | ✅ | - | 비밀번호 없이 접속 성공 |
SSH Key 인증은 처음 설정 시 다소 복잡해 보일 수 있지만, 한 번 제대로 구축하면 개발 생산성을 크게 향상시킬 수 있는 강력한 도구입니다. 특히 Windows 로컬 환경에서 Linux 원격 서버로 VS Code Remote-SSH를 사용하는 경우, 비밀번호 입력 없이 즉시 코드 편집 환경에 진입할 수 있어 워크플로우가 매끄럽게 연결됩니다.
이제 매일 비밀번호를 입력하는 수고에서 벗어나, 더 중요한 코드 작성과 문제 해결에 집중하시기 바랍니다.
읽어주셔서 감사합니다 ☀️