> 백엔드 개발 > PHP 튜토리얼 > JWT란 무엇입니까? JWT에 대한 간략한 이해

JWT란 무엇입니까? JWT에 대한 간략한 이해

不言
풀어 주다: 2023-04-04 09:30:01
앞으로
5682명이 탐색했습니다.

이 기사에서는 JWT가 무엇인지 설명합니다. JWT에 대한 간단한 이해는 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

이틀 전에 웹 확인을 하기 전까지는 jwt를 제대로 살펴본 적이 없었습니다. 한 친구가 저에게 jwt를 추천했습니다. 그제서야 나는 jwt가 모든 사람에게 널리 사용되고 있다는 것을 알게 되었습니다. 좀 나간 것 같아요. ㅎㅎ 세상의 장점을 잘 활용해서 이것저것 살펴보세요.

JWT(JSON Web Token)는 이름에서 알 수 있듯이 웹에서 전송할 수 있는 토큰입니다. 이 토큰은 JSON 형식으로 되어 있습니다. 이는 서로 다른 엔터티 간에 JSON 형식으로 정보를 안전하게 전송하는 간결하고 독립적인 방법을 정의하는 오픈 소스 표준(RFC 7519)입니다.

현재 많은 프로젝트에서 프런트엔드와 백엔드 분리, Restful API 모드를 사용하고 있습니다. 따라서 기존 세션 모드는 인증 요구 사항을 충족할 수 없습니다. 이때 jwt의 역할이 제공됩니다. Restful API 인증은 JWT의 좋은 적용 시나리오라고 할 수 있습니다.

다음은 매우 작은 데모입니다

<?php
require_once &#39;src/JWT.php&#39;;
header(&#39;Content-type:application/json&#39;);
//定义Key
const KEY = &#39;dasjdkashdwqe1213dsfsn;p&#39;;

$user = [
    &#39;uid&#39;=>&#39;dadsa-12312-vsd1s1-fsds&#39;,
    &#39;account&#39;=>&#39;daisc&#39;,
    &#39;password&#39;=>&#39;123456&#39;
];
$redis = redis();
$action  =  $_GET[&#39;action&#39;];
switch ($action)
{
    case &#39;login&#39;:
        login();
        break;
    case &#39;info&#39;:
        info();
        break;

}
//登陆,写入验证token
function login()
{
    global  $user;
    $account = $_GET[&#39;account&#39;];
    $pwd = $_GET[&#39;password&#39;];
    $res = [];
    if($account==$user[&#39;account&#39;]&&$pwd==$user[&#39;password&#39;])
    {
        unset($user[&#39;password&#39;]);
        $time = time();
        $token = [
            &#39;iss&#39;=>&#39;http://test.cc&#39;,//签发者
            &#39;iat&#39;=>$time,
            &#39;exp&#39;=>$time+60,
            &#39;data&#39;=>$user
        ];
        $jwt = \Firebase\JWT\JWT::encode($token,KEY);
        $res[&#39;code&#39;] = 200;
        $res[&#39;message&#39;] = &#39;登录成功&#39;;
        $res[&#39;jwt&#39;] = $jwt;

    }
    else
    {
        $res[&#39;message&#39;]= &#39;用户名或密码错误&#39;;
        $res[&#39;code&#39;] = 401;
    }
    exit(json_encode($res));
}





function info()
{
   $jwt = $_SERVER[&#39;HTTP_AUTHORIZATION&#39;] ?? false;
   $res[&#39;code&#39;] = 200;
   if($jwt)
   {
        $jwt = str_replace(&#39;Bearer &#39;,&#39;&#39;,$jwt);
        if(empty($jwt))
        {
            $res[&#39;code&#39;] = 401;
            $res[&#39;msg&#39;] = &#39;You do not have permission to access.&#39;;
            exit(json_encode($res));
        }
        try{
            $token = (array) \Firebase\JWT\JWT::decode($jwt,KEY, [&#39;HS256&#39;]);
            if($token[&#39;exp&#39;]<time())
            {
                $res[&#39;code&#39;] = 401;
                $res[&#39;msg&#39;] = &#39;登录超时,请重新登录&#39;;
            }
            $res[&#39;data&#39;]= $token[&#39;data&#39;];
        }catch (\Exception $E)
        {
            $res[&#39;code&#39;] = 401;
            $res[&#39;msg&#39;] = &#39;登录超时,请重新登录.&#39;;
        }
   }
   else
   {
       $res[&#39;code&#39;] = 401;
       $res[&#39;msg&#39;] = &#39;You do not have permission to access.&#39;;
   }
    exit(json_encode($res));
}



//连接redis
function redis()
{
    $redis = new  Redis();
    $redis->connect(&#39;127.0.0.1&#39;);
    return $redis;
}
로그인 후 복사

이 dmeo는 jwt를 사용하여 간단한 인증을 수행합니다. php-jwt 암호화 패키지가 사용됩니다 https://github.com/firebase/php-jwt

여기서 KEY는 jwt의 서명 부분인 정의된 개인 키입니다. 좋은.
php-jwt 패키지의 헤더 부분이 완성되었습니다. 암호화 코드는 다음과 같습니다

    */
    public static function encode($payload, $key, $alg = &#39;HS256&#39;, $keyId = null, $head = null)
    {
        $header = array(&#39;typ&#39; => &#39;JWT&#39;, &#39;alg&#39; => $alg);
        if ($keyId !== null) {
            $header[&#39;kid&#39;] = $keyId;
        }
        if ( isset($head) && is_array($head) ) {
            $header = array_merge($head, $header);
        }
        $segments = array();
        $segments[] = static::urlsafeB64Encode(static::jsonEncode($header));
        $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload));
        $signing_input = implode(&#39;.&#39;, $segments);

        $signature = static::sign($signing_input, $key, $alg);
        $segments[] = static::urlsafeB64Encode($signature);

        return implode(&#39;.&#39;, $segments);
    }
로그인 후 복사

기본 암호화 방식이 HS256임을 알 수 있습니다. 이것이 jwt가 안전한 이유이기도 합니다. 이 단계에서 HS256 암호화는 여전히 매우 안전합니다.
이 패키지는 인증서 암호화도 지원합니다.

이 패키지는 암호화 및 암호 해독 프로세스를 완료했습니다. 따라서 jwt에서는 포이로드 부분만 정의하면 됩니다. 이것이 데모의 토큰 부분입니다. 암호화가 성공하면 암호화된 JWT 문자열을 얻게 됩니다. 프런트 엔드는 다음에 API를 요청할 때 이 JWT 문자열을 인증으로 전달해야 합니다.
헤더에 승인을 추가하세요. 서버 측 확인 중에 응답의 유효성을 확인하기 위해 이 값을 얻습니다.

다음은 poyload의 몇 가지 일반적인 구성입니다

 $token   = [
            #非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。
            "iss"       => "http://example.org",
            #非必须。issued at。 token创建时间,unix时间戳格式
            "iat"       => $_SERVER[&#39;REQUEST_TIME&#39;],
            #非必须。expire 指定token的生命周期。unix时间戳格式
            "exp"       => $_SERVER[&#39;REQUEST_TIME&#39;] + 7200,
            #非必须。接收该JWT的一方。
            "aud"       => "http://example.com",
            #非必须。该JWT所面向的用户
            "sub"       => "jrocket@example.com",
            # 非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。
            "nbf"       => 1357000000,
            # 非必须。JWT ID。针对当前token的唯一标识
            "jti"       => &#39;222we&#39;,
            # 自定义字段
            "GivenName" => "Jonny",
            # 自定义字段
            "name"   => "Rocket",
            # 自定义字段
            "Email"     => "jrocket@example.com",
         
        ];
로그인 후 복사

여기에 포함된 구성은 자유롭게 구성할 수도 있고 다른 구성을 직접 추가할 수도 있습니다. 이는 온라인상에서 누구나 공통적으로 사용하는 일종의 합의라고 할 수 있습니다.

위 내용은 JWT란 무엇입니까? JWT에 대한 간략한 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿