ssh -N -L 3307:127.0.0.1:3306 <username>@<ssh-server-ip>
로컬 연결만 가능하도록 127.0.0.1 로 binding 된 MySQL 서버에 원격에서 접속하고 싶을 때, 해당 서버에 ssh 권한이 있다면 위의 명령을 통해 ssh 터널을 구성한 후 원격에서 3307로 접속하면 된다.
ssh -N -L 3307:127.0.0.1:3306 <username>@<ssh-server-ip>
로컬 연결만 가능하도록 127.0.0.1 로 binding 된 MySQL 서버에 원격에서 접속하고 싶을 때, 해당 서버에 ssh 권한이 있다면 위의 명령을 통해 ssh 터널을 구성한 후 원격에서 3307로 접속하면 된다.
bcrypt는 1999년에 Niels Provos와 David Mazieres가 개발한 암호화 해시 함수로, Blowfish 대칭 키 암호화 알고리즘을 기반으로 만들어졌습니다. 주로 웹 애플리케이션에서 사용자의 비밀번호를 안전하게 저장하기 위해 사용됩니다.
$2b$10$Qcfksu5KwUepA.zVDkkw4Oco0z14Kz2jgfD6sdoGieQfztY1KaIhK
└┬┘└┬┘└─────── Salt ────────┘└─────── Hashed result ───────┘
│ │
│ └── Cost factor (2의 10제곱 = 1024번 해싱)
└────── 버전 (2a, 2b, 2y 등)
brew install bcrypt
🔹 비밀번호 해싱
echo "yourPasswordHere" | bcrypt
$2a$06$D9f2gKT8iJ1Lg/YhH9QpneCn7vD0Qx7xDdwU5k7AlhOPKfMyVPMta
mkdir bcrypt-demo && cd bcrypt-demo
npm init -y
npm install bcrypt
const bcrypt = require('bcrypt');
// 커맨드라인에서 입력받은 비밀번호
const [,, password] = process.argv;
// 유효성 검사
if (!password) {
console.error("❗ 사용법: node bcrypt-hash.js <비밀번호>");
process.exit(1);
}
const saltRounds = 10; // 기본 비용 계수 (2^10 = 1024번 해시 반복)
// 해시 생성
bcrypt.hash(password, saltRounds, (err, hash) => {
if (err) {
console.error("❌ 에러:", err.message);
process.exit(1);
}
console.log("🔐 bcrypt 해시 결과:");
console.log(hash);
});
✅ 사용 방법
테스트 예시:
node bcrypt-hash.js mySecretPassword
const bcrypt = require('bcrypt');
// 커맨드라인 인자 받아오기
const [,, inputPassword, hashedPassword] = process.argv;
// 유효성 검사
if (!inputPassword || !hashedPassword) {
console.error("❗ 사용법: node bcrypt-test.js <암호> <해시>");
process.exit(1);
}
// 비밀번호 검증
bcrypt.compare(inputPassword, hashedPassword, (err, result) => {
if (err) {
console.error("❌ 에러 발생:", err.message);
process.exit(1);
}
if (result) {
console.log("✅ 비밀번호가 일치합니다!");
} else {
console.log("❌ 비밀번호가 일치하지 않습니다.");
}
});
✅ 사용 방법
테스트 예시:
node bcrypt-test.js mySecretPassword '$2b$10$WnV2Kk1aR8...'
ipsec.secrets 와 당연히 동일(e.g. mySecretKey)해야 한다.ipsec.conf의 leftid와 동일(e.g. dasomoli.org)해야 한다.FortiGate CLI에서 확인
diagnose vpn ike gateway list
또는:
diagnose vpn tunnel list
strongswan 을 설치한다.
brew install strongswan
/opt/homebrew/etc/ipsec.conf 설정 파일을 작성한다.
config setup
charondebug="ike 2, knl 2, cfg 2, net 2, esp 2"
conn fortigate
keyexchange=ikev1
aggressive=no
authby=psk
forceencaps=yes
installpolicy=yes
type=tunnel
left=%defaultroute
leftid=@dasomoli.org
right=11.13.3.1
rightid=11.13.3.1
leftsubnet=192.168.0.0/24
rightsubnet=192.168.64.0/19,10.30.0.0/16
leftupdown=/opt/homebrew/etc/ipsec-updown.sh
ike=aes256-sha256-modp2048!
esp=aes256-sha256-modp2048!
ikelifetime=86400s
lifetime=3600s
dpdaction=restart
auto=start
설정 파일에서 사용하는 /opt/homebrew/etc/ipsec-updown.sh 를 작성한다. 이는 strongSwan은 macOS에서 커널 라우팅 테이블에 자동으로 라우트를 추가하지 않기 때문이다. 이는 macOS 커널이 PF_ROUTE를 통해 정책 기반 라우팅을 제공하지 않기 때문이다. 따라서 updown 스크립트를 활용해 수동 라우팅을 추가한다.
#!/bin/sh
case "$PLUTO_VERB" in
up-client)
/sbin/route add -net 10.30.0.0/16 -interface $PLUTO_INTERFACE
/sbin/route add -net 192.168.64.0/19 -interface $PLUTO_INTERFACE
;;
down-client)
/sbin/route delete -net 10.30.0.0/16
/sbin/route delete -net 192.168.64.0/19
;;
esac
PSK를 /opt/homebrew/etc/ipsec.secrets 파일 안에 다음과 같이 넣는다.
@dasomoli.org @fortigate : PSK "mySecretKey"
macOS에서는 시스템 서비스로 실행되지 않기 때문에, 수동으로 아래와 같이 실행한다.
sudo ipsec start
또는
sudo ipsec down fortigate
sudo ipsec up fortigate
로그 확인:
log show --predicate 'process == "charon"' --info --last 5m
연결 확인:
ipsec statusall
종료:
sudo ipsec stop
라우팅 확인:
route -n get 10.30.0.1
혹은:
netstat -rn | grep 10.
파인더에서 다음 단축키를 누른다.
Command (⌘) + Shift (⇧) + . (마침표)
영구적으로 적용하고 싶다면 다음을 실행한다.
defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder
다시 되돌리고 싶다면 다음을 실행한다.
defaults write com.apple.finder AppleShowAllFiles -bool false
killall Finder
단축키
트랙패드
다음과 같은 에러가 발생한다면,
error: invalid active developer path (/Library/Developer/CommandLineTools)
다음을 실행.
xcode-select --install
https://www.codejam.info/2021/11/homebrew-multi-user.html 에서 설명하는 바로는 multi user 로서 사용하는 것은 좋지 않다고 한다. 한 사용자로 통일해서 사용하는 것이 좋다고 한다. 나는 첫번째 사용자로 dasomoli를 사용하므로 이에 맞춰서 설정하였다. alias 설정을 다음처럼 한다.
~/.zshrc 아래의 plugins 에 brew를 추가한다.
plugins=(
git
brew
)
그리고 ~/.zshrc 가장 아래에 alias를 추가한다.
alias brew='sudo -Hu dasomoli brew'

기본으로 Dock에 Launchpad 아이콘은 추가되어 있다. 없앴을 때 복구하고 싶다면 다음과 같이 한다.
아래처럼 “응용 프로그램” 전체를 볼 수 있는 아이콘을 추가한다.

기존에 Windows manager로 Veer를 쓰다가 Rectangle이 더 나은 것 같아 갈아탔다. 설치는 Rectangle 사이트(https://rectangleapp.com/)에서 다운로드 받아 설치하면 된다.

나같은 경우는 아래 절반, 위 절반을 사용하지 않기 때문에 둘 모두 없앴다. 대신 높이 최대화를 Ctrl + Option + 위, 가운데 절반을 Ctrl + Option + 아래로 설정했다.
32:9 울트라 와이드 모니터의 경우 Ctrl + Option + D, F, G가 유용할 것 같다. Ctrl + Option + D만 눌러도 1/3씩 토글되면서 움직인다.
왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래도 사용하지 않을 것 같아서 1/4 쪽으로 U, I, J, K도 바꿨다. 역시 Ctrl + Option + U만 눌러도 1/4씩 토글되면서 움직인다.
창 복원은 항상 Ctrl + Option + BackSpace 이다.