티스토리 뷰

개요

회사의 iOS 프로젝트들에 따로 존재하지만 같은 목적으로 사용되는 똑같은 코드들이 있었다.
로그를 위한 Logger, 유틸성 객체나 extension들을 모아둔 코드 등인데, 모듈화를 진행하면서 local spm으로 분리해놓은 상태였다.
문제는 이걸 각 프로젝트마다 소스 파일을 복붙해서 가지고 있고 Local Path를 통해 의존성을 추가해서 사용하고 있다는 것이다. 공통으로 관리되어야 함에도 각 프로젝트마다 따로 관리되고 있다는게 불편했다.
레포에 올려두고 사용하고 싶은데 회사 레포이다보니 Private이라 일반적인 방법으로는 불가능하기 때문에 다른 해결 방법을 찾아보았다.

방법 1. (👎)

dependencies: [
  .package(url: "https://user:password@github.com/user/private-repo.git", from: "1.0.0")
]

특정 계정에 강하게 묶여있는 데다가 중요한 정보가 노출되어야 하는 문제가 있다.

방법 2. (🤷‍♂️)

dependencies: [
  .package(url: "https://<token>:x-oauth-basic@github.com/user/private-repo.git", from: "1.0.0")
]

OAuth 토큰을 이용하는 방법 (안써봄)


방법 3. ⭐️

dependencies: [
  .package(url: "git@github.com:user/private-repo.git", from: "1.0.0")
]

ssh key를 이용하는 방법

계정 혹은 repository 별로 ssh key를 설정할 수 있다. repository 별로 ssh key를 설정한다면 보안 측면에서는 더 좋을것.


아래는 계정에 ssh key를 추가하는 방법이다.


우선 컴퓨터에 ssh key pair를 만들어야 하는데, 이미 생성된 key가 있는지 확인한다.

$ cat ~/.ssh/id_rsa.pub
cat: /Users/UserName/.ssh/id_rsa.pub: No such file or directory

~/.ssh/id_rsa.pub 파일이 없다면 아직 한번도 ssh key를 생성하지 않은 상태이다. (ssh key를 생성할때 기본 이름이 id_rsa 이다)



ssh-keygen 터미널에 ssh key pair 생성 커맨드를 입력한다.

Enter file in which to save the key (/Users/UserName/.ssh/id_rsa): key를 저장할 파일 경로를 입력

→ 그냥 엔터를 쳐서 기본 위치에 기본 파일명으로 만든다.

Enter passphrase (empty for no passphrase): key에 대한 비밀번호를 입력

→ 보통 그냥 엔터를 처서 넘어간다. empty for no passphrase ~


이렇게 기본 위치(/Users/UserName/.ssh/id_rsa)에 파일이 생성되며 키가 만들어진다.



ssh를 사용할 때 기본적으로 ssh 사용자ID@서버명 (User@HostName) 이렇게 사용한다.

Github, Bitbucket 에서 https가 아닌 ssh로 clone할 때 Github과 Bitbucket의 각 부분을 확인할 수 있다.

이를 참고해서 ~/.ssh/ 경로에 config 파일을 생성해서 아래와 같이 작성한다.

Host 호스트 # 각 호스트의 구분자 정도로 보면 될 것 같다.
  HostName 서버명 # ex: github.com, bitbucket.org, ...
  User 사용자명 # ex: git, ...
  IdentityFile ~/.ssh/파일이름 # 타겟 ssh key 파일 경로

# 예시
Host BitbucketPersonal
  HostName bitbucket.org
  User git
  IdentityFile ~/.ssh/id_rsa

# 예시
Host GithubPersonal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_git_personal



작성이 완료 되었으면 이제 bitbucket(혹은 github에) 공개키를 제공해줘야 한다.

계정의 Personal settings로 가서 SSH keys에서 Add Key 로 키를 추가한다.

터미널에서 cat ~/.ssh/id_rsa.pub | pbcopy 커맨드를 입력해서 앞서 만들었던 공개키(id_rsa.pub)를 클립보드에 복사하고 Key 입력칸에 붙여넣어준다.

Label은 비워놔도 되지만 키를 구분하기 위해 나는 회사맥북 id_rsa 정도로 입력해주었다.

키 추가가 완료되면 터미널에서 ssh -T git@bitbucket.org 를 통해 확인해본다.

만약 The authenticity of host @@@ can’t be established. 라는 메시지가 뜨면, 이는 bitbucket에 ssh url을 이용해서 처음 접근할때(~/.ssh/known_hosts에 정보가 없을때) 알려진 호스트로 추가하기 위해 경고 메시지가 뜨는 것이다.

다른 메시지는 https://support.atlassian.com/bitbucket-cloud/docs/troubleshoot-ssh-issues/ 참고


아래의 ssh_dispatch_run_fatal ~~~ Broken pipe 메시지는 파이프 연결 끊김 증상으로 서버 연결이 끊겼다는 메시지인데,

바로 다시 ssh -T git@bitbucket.org 커맨드를 입력하면

잘 된다.


이제 ssh url을 통해서 private repository 에서 패키지를 가져올 수 있다.

dependencies: [
  .package(url: "git@github.com:user/private-repo.git", from: "1.0.0")
]



추가로, 만약 ssh-keygen으로 키 생성할 때 passphrase를 입력한다면 빈번하게 이 비밀번호를 입력해야 하는데, config 파일에서 키체인을 사용하도록 설정한다면 최초에만 비밀번호를 물어본다.

Host BitbucketPersonal
  HostName bitbucket.org
  User git
  IdentityFile ~/.ssh/id_rsa
  UseKeychain yes # passphrase를 키체인에 저장!



참고자료

Using SSH keys to authenticate with private GitHub repositories in Swift Package Manager

How to use Swift Package Manager with private repos?

Set up an SSH key | Bitbucket Cloud | Atlassian Support

macOS에서 ssh passphrase 저장하기

ssh config 설정 방법