[Laravel 7] Zttp

원문: laravel-news

Zttp is coming to Laravel 7

Adam Wathan가 만든 Zttp(Guzzle wapper) 패키지는 Laravel 7에서 새로운 Http 패키지로 선보여 집니다.

이 기능을 추가하기위한 pull request를 보면 Guzzle를 사용할 때보다 약 90%정도 더 좋은 구문을 제공합니다.

새로운 Http에 기본적인 사용 방법에 대한 예시입니다.

use Illuminate\Support\Facades\Http;

$response = Http::post('url', [
    'name' => 'Taylor',
]);

echo $response['foo'];

$response->body()
$response->json()
$response->status()
$response->ok()
$response->successful() (>= 200 && < 300)
$response->serverError()
$response->clientError()

Taylor의 PR내용을 보면, 이 패키지는 완전 새로운 클라이언트가 아닌 Guzzle 윗 레이어에서 UX/DX를 좀더 펼리하게 해주는 역할을 한다고 합니다.

이 패키지는 복잡하고 많은 내용이 추가되는것이 아닙니다. 그리고 만약 더 많은 것들이 필요하다면 Guzzle를 직접 사용할 수 있습니다.

새로운 HTTP 패키지에 대한 내용을 알고 싶으면 pull request를 확인해보세요.


새로운 Http 패키지 분석 (?)

Taylor의 PR를 보면 “Guzzle의 모든 기능을 이 API를 통해 제공하려는게 아니다.”라고 적혀있는걸 보면 말 그대로 TEST나 간단한 Http request정도만 지원하고 나머지는 Guzzle를 직접 적으로 사용하라는것같다.

더 많은 예시

새로운 Http 패키지의 기본적인 content-typeapplication/json이라고 한다.
하지만 아래와 같은 코드로 쉽게 form-urlencoded요청을 보낼 수 있다.

$response = Http::asForm()->post('url', [
    'name' => 'Taylor',
]);

그리고 multi-part타입으로 파일을 보낼 수도 있다.

$response = Http::attach('name', 'stream/contents', 'filename.txt')->post('url');

해더 / 인증정보 (Authentication)

해더는 withHeaders 메소드로 보낼 수 있다.

$response = Http::withHeaders(['X-Foo' => 'bar'])->post('url', [
    'name' => 'Taylor',
]);

인증 / bearer 과 같은 토큰 정보는 withToken메소드로 보낼 수 있다.

$response = Http::withToken('token')->post('url', [
    'name' => 'Taylor',
]);

Basic Authenication은 withBasicAuth메소드로 보낼 수 있다.

$response = Http::withBasicAuth('username', 'password')->post('url', [
    'name' => 'Taylor',
]);

에러

ZTTP와 같이 기본적으로 서버, 클라이언트 에러를 출력하지 않는다고 한다.
하지만 만약 HTTP응답이 실패했을때 $response->throw()를 통해 예외 처리를 할 수 있다.

$response = Http::post(...);

if (! $response->successful()) {
    $response->throw();
}

Testing / Faking

Http::fake()를 지원하며, 기본적으로 비여있는 200응답을 한다.

Http::fake();

$response = Http::post('url');

Http::fake()는 인자로 Array를 받으며, 패턴이 일치하는 경우는 Http::response를 통해 응답을 만들어 낼 수 있으며, 만약 일치되는 패턴이 없다면, 실제로 실행된다.

Http::fake([
    'github.com/*' => Http::response([1, 2, 3], 200, ['Headers']),
]);

만약 모든 패턴에 대해서 실행되는것을 막고 싶다면 아래와 같이 작성할 수 있다.

Http::fake([
    'github.com/*' => Http::response([1, 2, 3], 200, ['Headers']),
    '*' => Http::response('', 200),
]);

연속적인 응답은 Http::sequentce를 이용해 지정된 순서에 맞게 응답이 출력된다.

Http::fake([
    '*' => Http::sequence([Http::response('foo', 200), Http::response('bar', 200)]),
]);

마지막으로 Http::fake()는 클로저를 지원한다.

Http::fake(function ($request) {
    return Http::response('foo', 200);
});

잡-설

잘 모르는 영어와 개발 코드를 보니 복잡하네요..
새로운 패키지가 들어오는건 좋지만 아직도 배울게 한참많은데
배워야 될것들이 계속 늘어나는걸 보면,, ㅜㅜ

[번역] 스팸과 싸우는 5가지 방법

원본글 : 5 Ways of Battling Form Spam

만약 여러분이 웹 어플리케이션을 만든다면, 스팸 봇들에게 점렴당하는 것들을 막을순 없을것입니다.

내 프로젝트 중 하나는 회원가입 폼 부분을 당해서 17,000여개의 가짜 유저을 정리하는 것은 정말 힘들었습니다.
이를 해결 하기위해 스팸 봇과 싸우는 방법을 트위터에 물어보았고, 많은 반응과 좋은 아이디어들을 얻을 수 있었습니다.
나는 언급된 방법들을 공유해 만약 여러분이 공격 당했을 때 어떻게 방어해야하는지 알게 될 수 있을 것입니다.

1. Cloudflare

만약 여러분이 클라우드플레어와 같은 서비스를 사용하고 있으면, “page rules”을 설정해 URL과 양식 제출을 중단 할 수 있습니다.

다만, 나는 잘 다른 방법들 처럼 잘 작동 하지 않을 것 이라고 생각합니다.
하지만, 이 방법은 이미 운영중인 서비스에 어떠한 영향도 없이 신속하게 구현이 가능합니다.

2. Honeypot

허니팟은 최우선 방어 방법이고 설치 또한 간단합니다.
폼 안에 아무런 값이 없는 hidden 타입에 input 태그를 두고, 만약 hidden 필드 안에 값과 함께 제출 된다면, 거의 봇일 것이다.

직접 이를 구현 할 수 있지만, spatie/laravel-honeypot과 같은 패키지가 조내하여 손쉽게 통합된 환경에서 구현 할 수 있습니다

‘name’이라는 input필드가 있다면 봇은 그 필드를 체워야 하는 필드로 생각한다는 것을 기억하시기 바랍니다.

3. Validate Emails(이메일 인증)

만약 이메일을 요구하는 양식이라면, 사용자 이메일로 메일을 보내어 이메일 안에 있는 버튼을 클릭하여 진짜인지 확인 할 수 있습니다.
이 방법은 Laravel Newsletter를 포함해 많은 뉴스레터가 사용하는 방식입니다.

사용자는 이메일을 입력하고, 우리의 서비스는 이메일을 보내면, 사용자는 승인버튼을 눌러 우리의 서비스에 가입 할 수 있다.

이렇게 하면 가입되는 유저는 봇이 아니라 실제 사용자들일 것 입니다.

다른 방법으론 API를 통해 이메을 확인해주는 identibyte와 같은 서비스를 사용하는 방법입니다.
이런 방법을 통해 사용자들은 추가적인 단계없이 가입 할 수 있습니다.

4. Capcha

이 방법은 제가 가장 좋아하는 방법입니다. 왜냐하면, 내가 캡차를 싫어하기 때문입니다.
Google가 가지고 있는 invisible reCaptcha는 아마 제일 좋은 캡차 옵션일 것입니다.

5. Dedicated Spam Services (스팸 차단 서비스)

두 가지의 유명한 스팸 서비스인 AkismetStop Forum Spam이 있습니다.
Akismet은 유료이고 Stop Forum Spam은 무료 입니다.

나는 Akismet 모든 워드프레스 사이트에 사용했습니다. 하지만, 워드프레스가 아닌 라라벨에서도 사용할 수 있습니다.
여러분은 들은 Akismet의 API를 사용하거나 nickurt/laravel-akismet과 같은 것을 사용하면 됩니다.

Stop Forum Spam은 무료 서비스 이며, Akismet와 유사합니다.
그리고 라라벨 페키지 nickurt/laravel-stopforumspam가 존재하며, 통합 적으로 사용할 수 있게 도움을 줍니다.


모든 옵션들은 honeypot을 해본 후 부터 사용하는것이 좋습니다.
만약 honeypot이 실패하면 봇이 공격을 막을때 까지 다른 옵션들을 사용하세요.
다만, 오늘 동작하는것이 내일엔 안할수도 있다는 것을 기억하고, 매일 봇들과 싸워야 한다는것을 잊지 마세요.