[Android] 앱 안의 Webview DevTools처럼 보기

아래와 같은 식으로 사용하면 된다.

  1. Android 기기/에뮬레이터에서 앱 실행
  2. PC Chrome에서 아래 열기

chrome://inspect/#devices

  1. Discover USB devices 체크
  2. 보고 싶은 앱 또는 앱의 WebView가 보이면 inspect 클릭

앱의 origin 을 알고 싶다면 열린 DevTools에서:

  • Console에 입력:

    window.location.origin

    • Network 탭에서 보고 싶은 URL 연결 클릭
    • Request Headers의 Origin 확인

    [Git] 로컬 브랜치 이름으로 자동 Push 설정하기

    새로운 브랜치를 만든 후 보통 다음과 같이 push 합니다.

    git push -u origin feature/login

    하지만 아래 설정을 하면 git push만으로 자동으로 원격 브랜치가 생성되고 upstream이 설정됩니다.

    git config --global push.autoSetupRemote true
    git config --global push.default current

    이후에는 다음처럼 사용할 수 있습니다.

    git checkout -b feature/login
    git push

    origin/feature/login 브랜치가 자동 생성되고 upstream도 함께 설정됩니다.

    [Android] adb wifi debugging 사용 방법

    1. 안드로이드 기기에서 개발자 옵션 켜기
    2. 개발자 옵션에서 “무선 디버깅” 켜기
    3. 무선 디버깅에서 페어링 코드로 기기 페어링 선택
    4. 호스트 컴퓨터에서 휴대폰에 나온 화면의 IP 주소 및 포트대로 adb pair <IP>:<PORT> 실행
      • 예제: adb pair 192.168.0.4:33917
    5. 호스트 컴퓨터에서 휴대폰에 나온 화면의 페어링 코드를 입력
      • 예제: Enter pairing code: 656685
    6. 연결됨. 호스트 컴퓨터에서 adb devices 를 실행하면 연결된 기기가 보일 것.
     dasomoli> ~> adb devices
    List of devices attached
    adb-R3CRC0G1A8L-FkwYCP._adb-tls-connect._tcp	device

    [Security] bcrypt 정리

    🔐 bcrypt란?

    bcrypt는 1999년에 Niels ProvosDavid Mazieres가 개발한 암호화 해시 함수로, Blowfish 대칭 키 암호화 알고리즘을 기반으로 만들어졌습니다. 주로 웹 애플리케이션에서 사용자의 비밀번호를 안전하게 저장하기 위해 사용됩니다.

    ✅ 주요 특징

    1. Salt 내장

    • bcrypt는 자동으로 salt를 랜덤 생성하여 포함시킵니다.
    • salt는 같은 비밀번호도 다른 해시 결과를 만들게 하여 무작위성을 증가시키고 레인보우 테이블 공격을 방어합니다.

    2. 비용 증가 (Cost factor)

    • cost 또는 work factor는 해시 계산에 걸리는 연산 횟수(또는 시간)를 조절합니다.
    • 예: cost 10이면 2¹⁰ = 1024번의 해시 계산을 수행합니다.
    • 이를 통해 컴퓨터 성능이 높아져도 쉽게 크래킹되지 않도록 시간적 방어 장치를 제공합니다.

    3. 느린 연산

    • 빠른 해시 함수(SHA-256 등)는 brute-force 공격에 더 취약한 반면, bcrypt는 의도적으로 느리게 설계되어 공격자를 어렵게 만듭니다.

    4. 결과에 버전과 cost 정보 포함

    $2b$10$Qcfksu5KwUepA.zVDkkw4Oco0z14Kz2jgfD6sdoGieQfztY1KaIhK
    └┬┘└┬┘└─────── Salt ────────┘└─────── Hashed result ───────┘
     │  │
     │  └── Cost factor (2의 10제곱 = 1024번 해싱)
     └────── 버전 (2a, 2b, 2y 등)
    • 2b → bcrypt 알고리즘 버전
    • 10 → cost factor (해시 반복 횟수 조절)
    • 그 뒤 22자 → salt (Qcfksu5KwUepA.zVDkkw4O)
    • 나머지 → 실제 해시된 비밀번호

    ⚠️ 주의할 점

    • bcrypt는 암호화(encryption)가 아닌 해싱(hash)입니다. 즉, 원래 값을 복호화할 수 없습니다.
    • 사용자가 로그인할 때는 입력된 비밀번호를 같은 방식으로 해시하고, 저장된 해시와 비교(compare)하여 확인합니다.
    • 비밀번호가 노출되었을 경우, 단방향이기 때문에 해시만으로는 원래 값을 알 수 없습니다.

    💻 Mac에서 간단히 CLI로 해시를 생성하는 방법

    🔹 Homebrew로 bcrypt 설치

    brew install bcrypt

    🔹 비밀번호 해싱

    echo "yourPasswordHere" | bcrypt
    • 예시 출력:
    $2a$06$D9f2gKT8iJ1Lg/YhH9QpneCn7vD0Qx7xDdwU5k7AlhOPKfMyVPMta

    💻 node.js 예제 코드

    🔹 프로젝트 폴더 생성 후 bcrypt 설치

    mkdir bcrypt-demo && cd bcrypt-demo
    npm init -y
    npm install bcrypt

    ✅ bcrypt-hash.js: 해시 생성 코드

    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

    ✅ bcrypt-test.js: 해시 검증 코드

    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...'

    [ssh] 다른 ssh 서버를 거쳐 접속할 때, ProxyJump

    ssh 서버 A를 거쳐 ssh 서버 B를 접속하고 싶다면 다음과 같이 ~/.ssh/configProxyJump 를 쓰면 ssh b.dasomoli.org 명령으로 바로 접근하는 것처럼 쓸 수 있다.

    Host a.dasomoli.org 11.22.33.44
        Hostname 11.22.33.44
        User dasomoli
        IdentityFile ~/.ssh/a.dasomoli.org.pem
    
    Host b.dasomoli.org 11.22.33.55
        Hostname 11.22.33.55
        User dasomoli
        IdentityFile ~/.ssh/b.dasomoli.org.pem
        ProxyJump dasomoli@a.dasomoli.org
    

    [Kafka] Kafka 대용 오픈소스 redpanda 설치 및 설정

    Ubuntu 24.04 에 repository 방식으로 설치할 때 다음과 같이 한다.

    curl -1sLf \\
      '<https://dl.redpanda.com/public/redpanda/setup.deb.sh>' | sudo -E bash
    sudo apt-get install -y redpanda-rpk
    sudo apt update
    sudo apt install redpanda

    broker.dasomoli.org 로 사용한다면, /etc/redpanda/redpanda.yaml 설정 파일 편집. 다음 부분을 고침.

      - address: "broker.dasomoli.org"
        port: 9092

    서비스 시작

    sudo systemctl enable --now redpanda

    서비스 상태 확인

    sudo systemctl status redpanda
    rpk cluster info --brokers broker.dasomoli.org:9092

    사용 중인 토픽 리스트 확인

    rpk topic list --brokers broker.dasomoli.org:9092

    위의 절차는 인증 없이 사용하게 된다.

    [VPN] FortiGate 장비와 MacOS 사이의 IPSec 터널 설정

    FortiGate 설정

    IPSec Tunnels 생성

    Network

    • Remote Gateway: “Dialup User”, Interface: “wan1″(공인 IP가 연결된 WAN 포트)
    • Local Gateway: Disable
    • Mode Config: Disable
    • NAT Traversal: Enable
    • Dead Peer Detection: On Idle
    • Add route: Disable
    • Auto discovery sender / receiver: Disable
    • Device creation: Enabled
    • Tunnel search: Selectors

    Authentication

    • Method: Pre-shared Key
    • Pre-shared Key: 정한 PSK를 적는다. 아래 MacOS 설정의 ipsec.secrets 와 당연히 동일(e.g. mySecretKey)해야 한다.
    • IKE Version: 1
    • IKE Mode Main(ID protection)
    • Peer Options: Accept Types는 Specific peer ID로 하고 Peer ID로 아래 ipsec.confleftid와 동일(e.g. dasomoli.org)해야 한다.

    Phase 1 Proposal

    • Encryption: AES256
    • Integrity: SHA256
    • DH Group: 14
    • Key Lifetime (seconds): 86400

    XAUTH

    • Type: Disabled

    Phase 2 Selectors

    • Subnet1
      • Local Address: 192.168.64.0/19 (192.168.64.0/255.255.224.0)
      • RemoteAddress: 192.168.0.0/24 (192.168.0.0/255.255.255.0)
      • Encryption: AES256, Integrity: SHA256, DH Group: 14
      • Enable Replay Detection: Enabled
      • Enable Perfect Forward Secrecy (PFS): Enabled
      • Local Port/Remote Port/Protocol: Enabled
      • Key Lifetime: 3600
    • Subnet2
      • Local Address: 10.30.0.0/16 (10.30.0.0/255.255.0.0)
      • RemoteAddress: 192.168.0.0/24 (192.168.0.0/255.255.255.0)
      • Encryption: AES256, Integrity: SHA256, DH Group: 14
      • Enable Replay Detection: Enabled
      • Enable Perfect Forward Secrecy (PFS): Enabled
      • Local Port/Remote Port/Protocol: Enabled
      • Key Lifetime: 3600

    Log 확인

    FortiGate CLI에서 확인

    diagnose vpn ike gateway list

    또는:

    diagnose vpn tunnel list

    그 외.

    • Static Routes에 터널 연결된 PC로의 routing이 추가되어야 한다.
    • Firewall Policy가 추가된 IPSec 터널을 위한 인터페이스에 incoming/outgoing 모두 허용되어야 한다.
      • NAT는 이 경우 Disable하여야 한다.

    MacOS 설정

    1. 사전 준비

    1.1. strongswan 설치

    strongswan 을 설치한다.

    brew install strongswan

    2. 설정 파일 작성

    /opt/homebrew/etc/ipsec.conf 설정 파일을 작성한다.

    • left: 내 Mac
    • right: FortiGate의 공인 IP
    • leftid, rightid: FortiGate와 일치해야 함
    • leftsubnet: 집 네트워크
    • rightsubnet: FortiGate 내부 네트워크
    • ike나 esp의 aes256-sha256-modp2048 는 Encryption: AES256, Integrity: SHA256, DH Group: 14를 의미한다. 느낌표(!)는 강제 적용을 의미한다.
    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"

    3. 실행 방법

    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.