laravel - 암호화 - store jwt




Laravel 5.6-Passport JWT 자체 소비 API 용 httponly 쿠키 SPA 인증? (3)

Laravel Passport JWT

  1. 이 기능을 사용하려면 쿠키 직렬화를 비활성화해야합니다. Laravel 5.5는 쿠키 값의 직렬화 / 직렬화 해제 문제가 있습니다. 자세한 내용은 여기 ( https://laravel.com/docs/5.5/upgrade )를 https://laravel.com/docs/5.5/upgrade

  2. 저것을 확인하십시오

    • 블레이드 템플릿 헤드에 <meta name="csrf-token" content="{{ csrf_token() }}"> 있습니다.

    • axios는 각 요청에 대해 csrf_token을 사용하도록 설정됩니다.

당신은 resources/assets/js/bootstrap.js 에서 이와 같은 것을 가지고 있어야합니다.

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
  window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
  console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
  1. 여기에 설명 된 설치 인증 경로 ( https://laravel.com/docs/5.5/authentication )
  2. 설치 여권은 여기에서 설명합니다 ( https://laravel.com/docs/5.5/passport ).

중요한 부분은 다음과 같습니다.

  • User 모델에 Laravel\Passport\HasApiTokens 특성을 추가하십시오.
  • config/auth.php 에서 api authentication guard의 driver 옵션을 passport 으로 config/auth.php 하십시오
  • \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, 미들웨어를 app/Http/Kernel.phpweb 미들웨어 그룹에 app/Http/Kernel.php

마이그레이션을 건너 뛰고 클라이언트를 생성 할 수도 있습니다.

  1. POST 요청을 /login 하여 자격 증명을 전달하십시오. AJAX 요청 또는 일반 양식 제출을 할 수 있습니다.

로그인 요청이 AJAX (액시스 사용) 인 경우 응답 데이터는 html이지만 관심있는 내용은 상태 코드입니다.

axios.get(
  '/login, 
  {
    email: '[email protected]',
    password: 'secret',
  },
  {
    headers: {
      'Accept': 'application/json', // set this header to get json validation errors.
    },
  },
).then(response => {
  if (response.status === 200) {
      // the cookie was set in browser
      // the response.data will be HTML string but I don't think you are interested in that
    }
    // do something in this case
}).catch(error => {
  if (error.response.status === 422) {
    // error.response.data is an object containing validation errors
  }
  // do something in this case
});

로그인시 서버는 제공되는 자격 증명으로 사용자를 찾고 사용자 정보 (id, email ...) (이 토큰은 아무 곳에도 저장되지 않음)를 기반으로 토큰을 생성 한 다음 서버는 생성 된 토큰을 포함하는 암호화 된 쿠키로 응답을 반환합니다.

  1. 보호 된 경로로 API 호출을합니다.

보호 된 경로가 있다고 가정합니다.

Route::get('protected', '[email protected]')->middleware('auth:api');

axis를 정상적으로 사용하여 ajax 호출을 할 수 있습니다. 쿠키는 자동으로 설정됩니다.

axios.get('/api/protected')
  .then(response => {
    // do something with the response
  }).catch(error => {
    // do something with this case of error
  });

서버가 호출을 수신하면 laravel_cookie 요청을 해독하고 사용자 정보 (예 : id, email ...)를 얻습니다. 그런 다음 해당 사용자 정보가 데이터베이스 조회를 수행하여 사용자가 존재하는지 확인합니다. 사용자가 발견되면 사용자는 요청 된 자원에 액세스 할 수있는 권한이 부여됩니다. 그렇지 않으면 401이 리턴됩니다.

JWT 토큰을 무효화합니다. 주석을 언급 할 때이 토큰은 서버의 어느 곳에도 저장되지 않으므로 걱정할 필요가 없습니다.

최신 정보

포인트 3에 관해서 Laravel 5.6 Auth는 새로운 메소드 logoutOtherDevices 있습니다. 설명서가 매우 가볍기 때문에 여기에서 자세한 내용을 확인할 수 있습니다 ( https://laracasts.com/series/whats-new-in-laravel-5-6/episodes/7 ).

Laravel 버전을 업데이트 할 수 없다면 5.6에서 어떻게 완료되었는지 확인하고 5.5에 대한 독자적인 구현을 구축하십시오

귀하의 질문에서 포인트 4. app/Http/Controllers/Auth 에있는 컨트롤러를 살펴보십시오.

access_tokens 및 refresh_tokens와 관련해서는 완전히 다른 접근 방식입니다. 당신은 그것을하는 방법을 설명 온라인 튜토리얼을 많이 찾을 수 있습니다.

희망이 도움이됩니다.

추신. 새해 복 많이 받으세요!! :)

참고 : 이 질문에 대한 제 3의 현상금입니다. 너무 솔루션에 관심이 있다면 upvote하시기 바랍니다.

나는 많은 조사를 해왔지만 정보는 항상 짧아지고 끝나지 않았다. 자체 소비 API를 위해 JWT httponly 쿠키로 Laravel을 사용할 때 (대부분의 자습서 온라인은 JWT가 매우 안전하지 않은 로컬 저장소에 저장되어 있다는 것을 보여준다. ). 여권에 의해 JWT가 포함 된 httponly 쿠키가 Javascript 측에서 사용자를 식별하는 데 사용되어 서버에 대한 모든 요청과 함께 사용자가 자신이 말하는 사람인지 확인하는 데 사용되어야합니다.

또한이 설정 작업을 수행하는 방법에 대한 전체 그림을 보려면 다음을 포함하는 단일 자습서에서 발견하지 못한 몇 가지 추가 사항이 있습니다.

  1. Laravel Passport (tymon auth가 아님)는 암호화 된 JWT를 생성하고 JS 측에서 로그인 한 후 응답으로 httponly 쿠키로 보냅니다. 어떤 미들웨어를 사용할 것인가? 새로 고침 토큰이 더 많은 보안을 추가하는 경우 구현 방법은 무엇입니까?
  2. auth 엔드 포인트를 호출하는 JavaScript (axios 등) api 의사 코드, httponly 쿠키가 백엔드로 전달되는 방법 및 백엔드 확인 토큰이 유효한 지 확인합니다.
  3. 단일 계정이 여러 장치에서 로그인 한 경우 장치가 도난 당했을 때, 모든 공식 사용자 장치에서 액세스를 취소하는 방법 (사용자가 제어 권한이있는 로그인 된 장치에서 암호 변경을 수행한다고 가정)
  4. 로그인 / 등록, 로그 아웃, 비밀번호 변경, 비밀번호 찾기 컨트롤러 메소드는 일반적으로 토큰의 생성 / 검증 / 철회를 처리하는 것처럼 보입니까?
  5. CSRF 토큰 통합.

이 질문에 대한 답은 미래의 독자들과 지금 당장 고군분투하는 독자들에게 위와 같은 내용을 담고있는 자체 소비 API에 대한 답변을 찾기위한 쉬운 지침이되기를 바랍니다.

업데이트 1 :

  1. 이전에 CreateFreshApiToken 시도했지만, 위의 3 번과 4 번 포인트의 경우 사용자의 토큰을 취소 할 때는 작동하지 않습니다. 이것은 CreateFreshApiToken 미들웨어에 대해 이야기 할 때 코어 래벨 개발자가 작성한 이 주석 을 기반으로 합니다 .

이 미들웨어로 생성 된 JWT 토큰은 아무 곳에도 저장되지 않습니다. 그들은 취소되거나 "존재하지"않을 수 있습니다. 그들은 단순히 laravel_token 쿠키를 통해 API 호출을받을 수있는 방법을 제공합니다. 액세스 토큰과 관련이 없습니다. 또한 일반적으로 클라이언트가 발행 한 동일한 앱에서 토큰을 사용하지 않습니다. 첫 번째 또는 타사 앱에서 사용할 수 있습니다. 미들웨어 또는 클라이언트 발급 토큰 중 하나를 사용하지만 둘 다 동시에 사용하지 마십시오.

따라서 토큰을 취소하기 위해 포인트 3과 4를 수용 할 수있는 것처럼 보이며 CreateFreshApiToken 미들웨어를 사용하는 경우 그렇게 할 수 없습니다.

  1. 클라이언트 쪽에서 보면 Authorization: Bearer <token> 것으로 보입니다 Authorization: Bearer <token> 은 안전한 httpOnly 쿠키를 처리 할 때 사용할 수있는 방법이 아닙니다. 요청 / 응답은 laravel docs를 기반으로하는 요청 / 응답 헤더로 안전한 httpOnly 쿠키를 포함한다고 가정합니다.

이 인증 방법을 사용할 때 기본 Laravel JavaScript 스캐 폴딩은 Axios에 항상 X-CSRF-TOKEN 및 X-Requested-With 헤더를 보내도록 지시합니다.

headerswindow.axios.defaults.headers.common = {
    'X-Requested-With': 'XMLHttpRequest',
    'X-CSRF-TOKEN': (csrf_token goes here)
};

이것은 또한 위의 모든 요점을 다루는 솔루션을 찾고있는 이유이기도합니다. 죄송합니다. 5.5가 아닌 Laravel 5.6을 사용하고 있습니다.

업데이트 2 :

암호 부여 / 새로 고침 토큰 부여 콤보가가는 길입니다. Password Grant / Refresh Token Grant 콤보를 사용하여 구현 가이드를 쉽게 찾을 수 있습니다.

비밀번호 부여 : 이 보조금은 Google 웹 사이트의 모바일 앱처럼 신뢰할 수있는 클라이언트를 다룰 때 적합합니다. 이 경우 클라이언트는 사용자의 로그인 자격 증명을 권한 서버로 보내고 서버는 액세스 토큰을 직접 발급합니다.

토큰 부여 새로 고침 : 서버가 액세스 토큰을 발급하면 액세스 토큰의 만기도 설정됩니다. 새로 고침 토큰 부여는 만료 된 액세스 토큰을 새로 고칠 때 사용됩니다. 이 경우, 권한 서버는 u 액세스 토큰을 요청하는 데 g 용될 수있는 액세스 토큰을 _ 행하는 동안 새로 고 '토큰을 보냄니다.

토큰 작성 / 취소 / 새로 고침, 로그인 쿠키 생성, 로그인 쿠키 생성, 쿠키 생성 / 삭제 , 암호 해독 / 새로 만들기 토큰 그랜트 콤보를 사용하여 간단하고 구현하기 쉬운 방법을 찾고 있습니다. 로그 아웃 쿠키 해지, 컨트롤러 메소드, CSRF 등


나는 또한 프로젝트에서 Laravel 여권을 구현했으며, 나는 당신이 당신의 질문에서 언급 한 요점의 대부분을 다루었다고 생각합니다.

  1. 액세스 토큰을 생성하고 토큰을 새로 고치는 데 암호 부여를 사용했습니다. these 단계에 따라 여권을 설정하고 여권 부여를 구현할 수 있습니다. 로그인 방법에서는 사용자 자격 증명의 유효성을 검사하고 토큰을 생성 하고 응답에 쿠키 첨부 (쿠키를 응답에 첨부 )해야합니다. 필요한 경우 몇 가지 예를 얻을 수 있습니다.
  2. Cors (들어오는 요청 헤더 처리) 용 2 개의 미들웨어를 추가하고 들어오는 액세스 토큰이 유효한지 또는 유효하지 않은지를 확인하기 위해 저장된 새로 고침 토큰 ( 새로 고침 토큰 )에서 액세스 토큰을 생성하는지 확인합니다. 나는 그 예를 보여 줄 수있다.
  3. 로그인 후, 클라이언트 측의 모든 요청에는 Authorization 헤더 ( Authorization: Bearer <token> )가 있어야합니다.

위의 사항들을 분명히 알고 있다면 알려주십시오.


  • Laravel Passport는 PHP League의 OAuth 서버를 구현 한 것입니다.
  • 사용자 이름 + 암호 인증에 암호 부여 유형을 사용할 수 있습니다.
  • 프록시에서 인증 요청을 만들어 클라이언트 자격 증명을 숨기십시오.
  • 새로 고침 토큰을 HttpOnly 쿠키에 저장하여 XSS 공격의 위험을 최소화하십시오.

자세한 정보는 여기를 참조하십시오.

http://esbenp.github.io/2017/03/19/modern-rest-api-laravel-part-4/





cookie-httponly