WordPress에서 JWT Authentication(JWT 인증) 적용하기

2021. 10. 12. 18:23개발을 파헤치다/Web

반응형

들어가며

WordPress REST API

 

혹시 WordPress REST API를 활용하여 앱이나 웹사이트를 만들 계획이 있으신가요? 그렇다면 이번 아티클은 당신에게 큰 행운이 될 겁니다. 삽질하는 시간을 대폭(4시간 이상) 줄여줄 꿀팁이 들어있으니깐요. WordPress는 단순 블로그뿐만 아니라 쇼핑몰로도 활용이 가능합니다. 이렇게 점차 쓰임이 많아지면서 WordPress를 주축으로 서비스를 하는 경우가 많은데요. 예를 들어, 온라인 쇼핑몰을 WordPress로 사용하고 매출이 크게 늘어 모바일 플랫폼(안드로이드/ IOS)으로 확장을 할 수도 있겠죠. 이런 경우 WordPress를 백엔드로 REST API를 커스텀해가며 개발을 진행해야 합니다.

시작하자마자 문제가 될 가능성이 높은 부분이 바로 사용자 인증 부분이죠. 보통 모바일 플랫폼에서는 서버와 REST API로 통신할 때 토큰 인증방식을 사용하는데요. WordPress의 기본 인증방식은 Basic Auth이기 때문입니다. 하지만 걱정 마세요. JWT(Jason Web Token) 인증방식으로 WordPress REST API 통신하는 방법을 제가 5분 만에 알려드릴게요.

 

JWT 플러그인 적용

 

가장 먼저 해야 할 것은 JWT Authentication(JWT 인증) 플러그인을 설치하는 겁니다.

여기에서 플러그인을 먼저 설치해주세요.

JWT Authentication Plugin

플러그인 설치를 완료하고 Activate 버튼을 눌러 활성화를 시켜줍니다.

JWT 인증이 제대로 적용되려면 활성화 이외에도 한 가지 더 작업을 해주어야 하는데요.

 

wp-config.php 파일을 약간 수정해줘야 합니다.

이 파일의 위치는 WordPress가 설치된 서버에서 찾을 수 있습니다. 

보통 WordPress 루트 디렉터리 > public 밑에 보시면 있을 겁니다.

 

이제 JWT 인증 사용을 위해서 Secret Key를 등록해주시면 됩니다.

// wp-config.php
...
/** JWT Auth key */
define('JWT_AUTH_SECRET_KEY', 'q3y7bL*A&C -P|6UTr~/S-<;xOb2`QO}~Q&mKwQ[7y%w^B6:[|<*6-dBQ Q-ypj');

여기에서 Secret Key로 넣을 값을 생성할 수 있습니다.

반드시 고윳값이 들어가야 하는데 위 사이트에서 만들면 어지간한 경우 빼고는 고윳값이기 때문에 그냥 넣어주시면 됩니다.

위처럼 값을 설정해주고 저장해주면 바로 적용이 됩니다. 굳이 WordPress 서버를 재부팅할 필요는 없습니다.

 

Postman으로 테스트하기

 

이제 Postman을 사용해서 REST API를 호출해볼 겁니다.

혹시 Postman 사용법을 모르시는 분은 여기를 참고해주세요.

 

일단 JWT 인증이 어떻게 이루어지는지 간략하게 설명드릴게요.

먼저 JWT 토큰 발급 API를 호출합니다. 이때 WordPress에 등록된 사용자 이메일과 비밀번호 값이 필요합니다.

JWT 플러그인에서 사용자 인증 정보가 제대로 된 값인지 검증한 뒤에 토큰을 발급해서 리턴해줍니다.

이제 발급받은 토큰 값으로 WordPress의 다양한 API를 호출할 수 있게 되는 것이죠.

 

JWT 토큰을 요청하는 URL에 대해서 살펴볼까요?

호스트 주소(도메인)에 wp-json이 붙게 되면 REST API를 호출한다는 의미가 됩니다.

그 뒤에는 플러그인 별로 다양한 API들을 호출할 수 있게 됩니다. 이들을 구분하기 위한 이름을 namespace라고 부릅니다.

JWT 플러그인의 경우 namespace는 jwh-auth/v1입니다.

따라서 호출하는 URL은 아래와 같습니다.

POST https://your-domain.com/wp-json/jwt-auth/v1/token

해당 요청의 Body값에 두 필드 값을 넣어서 보내주면 토큰을 받을 수 있습니다.

  • username: WordPress 가입 이메일
  • password: 비밀번호

 

Postman 에러

만약 위와 같은 에러가 나왔다면 앞에서 설정했던 JWT Secret key에서 오류가 난 것입니다.

다시 설정을 해주세요.

 

JWT 인증 성공

정상적으로 요청이 보내지면 위와 같이 200 OK와 함께 토큰 정보가 리턴됩니다.

이제 이 토큰을 가지고 WordPress의 여러 가지 API를 호출할 수 있죠.

예를 들어, WordPress의 사용자 정보를 한번 호출해보겠습니다.

 

JWT 인증 활용

발급받은 토큰을 요청의 헤더 부분에 적용시켜주어야 합니다.

헤더에는 Key값과 Value값이 들어가는데요. 아래와 같이 Key에는 Authorization, Value에는 Bearer [발급받은 토큰 값]을 넣어주시면 됩니다.

Authorization: Bearer [JWT Token값] // Bearer 다음에 공백을 꼭 넣어주셔야합니다

이렇게 설정하고 요청을 보내면 인증 오류가 뜨지 않고 API 응답이 오게 됩니다.

 

Basic Auth와 함께 사용 시 주의점

 

JWT 인증과 Basic Auth를 함께 사용하는 경우 에러가 발생하게 됩니다.

403 JWT Header Malformed라는 에러인데요.

JWT 인증 플러그인을 적용하게 되면 요청 헤더에 토큰 값을 검사하도록 되어있는데 토큰 값을 넣지 않아 발생하는 에러입니다.

이런 경우, Basic Auth로 요청이 왔을 때 내부적으로 JWT 토큰 값을 생성하여 에러가 나지 않도록 할 수 있습니다.

다만, 조금 번거롭지만 플러그인 코드를 수정해줘야 하는데요.

 

위의 PHP 파일을 열어서 아래와 같이 수정을 해줍니다.

 

/*
         * The HTTP_AUTHORIZATION is present verify the format
         * if the format is wrong return the user.
         */
        list($token) = sscanf($auth, 'Bearer %s');
        // add following code
        if (!$token) {
            // Get token using basic auth
            list($username, $password) = explode( ':', base64_decode( substr( $auth, 6 ) ) );
            $request = new WP_REST_Request( 'POST', '/wp-json/jwt-auth/v1/token' );
            $request->set_param( 'username', $username );
            $request->set_param( 'password', $password );
            $JWT = new Jwt_Auth_Public('jwt-auth', '1.1.0');
            $token = $JWT->generate_token( $request );
            if (is_array($token) && isset($token['token'])) $token = $token['token'];
            return;
        }
        if (!$token) {
            return new WP_Error(
                'jwt_auth_bad_auth_header',
                'Authorization header malformed.',
                array(
                    'status' => 403,
                )
            );
        }

위의 코드를 추가하면 토큰 없이 Basic Auth로 요청이 와도 인증이 성공한 경우 내부적으로 토큰 값을 생성합니다.

에러 없이 Basic Auth와 JWT 인증을 함께 사용할 수 있는 것이죠.

 

 

반응형