Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

Envflow 구축:Laravel 및 Upstash Redis를 사용하여 환경 변수를 안전하게 공유

저는 최근 Nuno Maduro의 프로젝트인 Pyre에서 영감을 받았습니다. Pyre는 원하는 사람에게 짧은 비밀 메시지를 보낼 수 있는 웹 앱입니다. 이 메시지는 암호화되어 저장되어 있으며 귀하 또는 귀하가 해독 링크를 공유한 사람만 읽을 수 있습니다.

저는 Upstash Redis와 비슷한 것을 구축하고 싶었기 때문에 환경 변수 공유라는 틈새 시장을 선택했습니다. 어느 순간 팀원들과 비밀을 공유해야 하고 이를 안전하게 수행할 수 있는 시스템을 구축하는 방법에 대해 고민한 적이 있을 것입니다.

암호화된 데이터를 저장하고 공유하기 위한 기본 데이터베이스로 Upstash Redis를 사용하는 제가 구축한 Laravel 샘플 프로젝트인 Envflow를 소개합니다.

지루한 세부 사항은 건너뛰고 처음부터 끝까지 이 프로젝트를 구축하는 과정을 안내해 드리겠습니다.

스택

먼저 저는 PHP를 채택하고 유명한 TALL 스택을 사용하여 프로젝트를 빌드하기로 결정했습니다.

  • 순풍 CSS
  • 알파인 JS
  • 라라벨
  • 라이브와이어
  • 업스태시 레디스

데이터베이스

일정 시간이 지나면 만료될 수 있는 암호화된 데이터를 빠르고 저렴하게 저장할 수 있는 장소가 필요했습니다. 짐작하셨겠지만 저는 Upstash Redis를 선택했습니다.

Upstash Redis는 서버리스 Redis 호환 데이터베이스이므로 실제로 이 사용 사례에 완벽했습니다.

잠깐만요... Upstash Redis 및 Laravel에 대한 시작하기 가이드가 있습니다!

자세히 알아보기

경로/종점

Envflow는 세 가지 주요 경로와 프로젝트의 내용을 설명하는 보조 경로에서 실행됩니다. 이러한 경로는 routes/web.php에서 찾을 수 있습니다. 파일입니다.

홈페이지

홈페이지 경로는 프로젝트의 랜딩 페이지 역할을 할 뿐만 아니라 환경 변수를 암호화할 수 있는 Livewire 양식도 포함합니다. 이 페이지에서는 환경 변수를 해독할 수 있는 횟수와 유효 기간을 설정할 수 있습니다.

Envflow 구축:Laravel 및 Upstash Redis를 사용하여 환경 변수를 안전하게 공유

app/Livewire/EncryptEnvPage.php에서 Livewire 페이지 구성요소를 찾을 수 있습니다. resources/views/livewire/encrypt-env-page.blade.php의 해당 템플릿 .

성공 페이지

성공 페이지는 암호 해독 링크를 공유하는 두 가지 방법을 표시하는 간단한 페이지입니다. 하나는 암호 해독 키를 포함하고 다른 하나는 암호 해독 키를 링크에서 분리합니다.

Envflow 구축:Laravel 및 Upstash Redis를 사용하여 환경 변수를 안전하게 공유

app/Livewire/SuccessPage.php에서 Livewire 페이지 구성요소를 찾을 수 있습니다. resources/views/livewire/success-page.blade.php의 해당 템플릿 .

복호화 페이지

이 페이지는 모든 암호 해독 마법이 일어나는 곳입니다. Upstash Redis 데이터베이스에 암호화 키를 저장하지 않고 암호화된 값만 저장한다는 점을 기억하세요. 암호 해독 페이지의 주요 작업은 암호 해독 키를 가져와서 환경 변수의 암호를 해독하는 것입니다.

Envflow 구축:Laravel 및 Upstash Redis를 사용하여 환경 변수를 안전하게 공유

app/Livewire/DecryptEnvPage.php에서 Livewire 페이지 구성요소를 찾을 수 있습니다. resources/views/livewire/decrypt-env-page.blade.php의 해당 템플릿 .

작업

이 프로젝트에서는 Action/Executor 패턴을 사용하여 내 애플리케이션에서 비즈니스 로직의 주요 구성 요소를 구성했습니다. 이를 통해 코드가 커질 때 향후 재사용성, 테스트 가능성 및 유지 관리성이 가능해지며, 애플리케이션의 여러 부분, 예를 들어 미래 API 간에 이러한 동작을 공유할 수도 있습니다... 누가 알겠어요...

app/Actions에서 작업을 찾을 수 있습니다. 하지만 환경 변수의 암호화 및 암호 해독을 처리하는 주요 구성 요소인 Encrypt 및 Decryptactions에 대해 설명하겠습니다.

암호화

Laravel에 암호화 도우미가 내장되어 있어서 운이 좋았지만 런타임에 생성된 사용자 정의 암호화 키를 제공하고 싶었기 때문에 약간 다른 것이 필요했습니다.

한참을 헤매다가 방법을 찾았습니다! Laravel의 기본 클래스 Illuminate\Encryption\Encrypter를 사용할 수 있습니다. .

use Illuminate\Encryption\Encrypter;
 
$encrypter = new Encrypter(
 'custom-encryption-key', // this is the one we would want to generate
 config('app.cipher'), // we'll use Laravel default cipher
);
 
// Hooray! We can now encrypt our value
$encryptedValue = $encrypter->encryptString($value);

좋습니다... 이제 암호화가 작동하고 있습니다. 제가 공유한 파일을 확인해 본 적이 있다면 암호화 및 암호 해독 작업에서 이 코드를 찾을 수 있다는 것을 눈치채셨을 것입니다.

저장공간

Actions와 Laravel의 기본 Encrypter을 사용하는 방법을 다루었습니다. 클래스를 사용하여 값을 암호화하고 해독하지만 아직 Upstash Redis에 값을 저장하는 방법을 다루지 않았습니다.

해당 코드는 StoreEnvFile에 있습니다. 액션.

해당 파일에서 다음 코드의 몇 가지 사항을 강조하고 싶습니다.

// ...
 
RedisFacade::pipeline(function (Redis $pipe) use (...) {
 $options = ['EX' => $ttl]; // here is where we set the expiration time
 $pipe->set("envfile:$id", $encrypted->value, $options);
 $pipe->set("envfile:$id:shareLimit", $shareLimit, $options);
});
 
// ...

위의 코드에서 Redis 파이프라인이 사용되는 것을 볼 수 있으며, 이를 통해 모든 명령이 단일 트랜잭션에서 실행되는지 확인할 수 있습니다. 이는 set 명령이 실패할 경우 암호화된 값을 저장하고 싶지 않기 때문에 중요합니다.

배포

배포에는 최근 출시된 Laravel Cloud를 사용했습니다.

Laravel Cloud에 배포하는 것은 매우 쉬웠습니다. 저장소에서 Redis 인스턴스와 프로비저닝된 도메인이 연결된 완전히 배포된 앱으로 이동하는 데 1분도 채 걸리지 않았습니다. 지금도 배포에는 30초 미만이 소요됩니다. 🚀

Envflow 구축:Laravel 및 Upstash Redis를 사용하여 환경 변수를 안전하게 공유

https://envflow.laravel.cloud에서 배포된 프로덕션 환경을 방문할 수 있습니다.

결론

이 게시물이 도움이 되기를 바라며 제가 Envflow를 구축한 방법을 이해하는 데 도움이 되었기를 바랍니다.

Upstash Redis를 기본 데이터베이스로 사용할 수 있는 애플리케이션이 많이 있다고 생각합니다. 여기 Redis가 KV 저장소로 사용되었더라도 그보다 훨씬 더 많은 일을 할 수 있으며 앞으로 제가 작업할 다른 프로젝트에서 이에 대해 다루도록 하겠습니다.

이 프로젝트의 소스 코드는 GitHub에서 사용할 수 있습니다. 아이디어나 제안 사항이 있거나 버그를 발견하면 자유롭게 확인하고 기여해 주세요.