티스토리 API를 위한 access_token 발급 사이트
티스토리 API 이용을 위한 사이트를 만드는 개발과정에서 다룬 문제에 대해 다루는 글이다.
사이트 제작동기
전자책 작성 과정 중에 티스토리 글 포스팅을 자동화하는 과정을 작성할 필요가 있었다.
포스팅 자동화를 위해서는 티스토리 글쓰기 api를 활용해야하고, api활용에는 access_token을 얻는 과정이 요구되었다.
access_token을 얻는 과정이 개발에 친숙하지 않은 사람에게는 어려울 수 있어, 이 과정들을 그대로 넣기에는 "모두가 쉽게 따라할 수 있는 책"이라는 책의 취지에 맞지 않을 것 같다는 생각이 들었다.
그래서 티스토리 api를 사용하기 위해 필요한 access_token,catecory_id 등을 개발에 친숙하지 않은 분들도 쉽게 발급할 수 있도록 사이트를 만들었다.
개발 중 발생했던 문제
access_token을 받아오는 api의 테스트 중에에서 CORS에러가 발생했었다.
Access Token 발급 api관련 문서내용은 다음과 같다.
발생원인
서버단에서 실행해야하는 api를 클라이언트에서 fetch해서 cors에러가 발생했다.
해결방법
Firebase Functions와 Firebase Hosting을 사용하여 cors에러를 해결할 수 있었다.
구체적인 방법은 아래와 같다.
예를 들어, 다음과 같은 간단한 API가 있다고 가정해 보자.
// Firebase Functions에서 작성한 API
exports.myApi = functions.https.onRequest((req, res) => {
const message = req.body.message || 'Hello from Firebase!';
res.send(message);
});
이 API는 HTTP POST 요청을 수신하고 message 필드를 반환한다. 이제 이 API를 Firebase Hosting을 사용하여 호스팅할 수 있다.
1. Firebase Functions API를 배포
먼저 Firebase CLI를 사용하여 Firebase Functions API를 배포한다. 이렇게 하면 Firebase Functions가 호스팅되고 해당 API를 호출할 수 있는 엔드포인트 URL이 나온다.
2. Firebase Hosting 구성 파일 작성
다음으로 Firebase Hosting 구성 파일을 작성한다. Firebase Hosting 구성 파일은 Firebase Hosting이 정적 파일을 호스팅할 때 사용되는 설정 파일이다. Firebase CLI를 사용하여 새 구성 파일을 생성할 수 있다.
// firebase.json
{
"hosting": {
"public": "public",
"rewrites": [
{
"source": "/api/**",
"function": "myApi"
}
]
}
}
위 구성 파일에서, public 디렉토리는 Firebase Hosting이 호스팅하는 정적 파일의 위치를 지정하고, rewrites 배열은 Firebase Hosting이 source로 지정된 URL 패턴을 만족하는 요청을 function으로 지정된 Firebase Functions API로 재전송하는 방법을 지정한다.
3. Firebase Hosting에 정적 파일 업로드
이제 Firebase Hosting에 정적 파일을 업로드한다. Firebase CLI를 사용하여 public 디렉토리에 정적 파일을 추가할 수 있다.
4. Firebase Hosting에 API 호출
이제 Firebase Hosting에서 호스팅되는 정적 파일을 통해 API를 호출할 수 있다. 예를 들어, 클라이언트에서 https://example.com/api URL에 HTTP POST 요청을 보내면 Firebase Functions API가 호출되고 message 필드의 값을 반환한다. 클라이언트는 Firebase Functions API를 직접 호출하지 않고 Firebase Hosting에 요청을 보내므로 클라이언트에서 요청이 안되는 API를 호스팅할 수 있다.
즉, Firebase Hosting은 정적 파일을 호스팅하고, Firebase Functions는 클라이언트에서 요청이 안되는 API를 처리하고, Firebase Hosting이 해당 API에 대한 요청을 Firebase Functions로 재전송한다. 이를 통해 클라이언트는 Firebase Functions API를 직접 호출하지 않고도 API를 사용할 수 있다.
관련 개념 더 알아보기
Firebase로 클라이언트에서 요청이 안되는 API를 호스팅할 수 있는 이유
Firebase Functions는 서버리스 백엔드 기능을 제공하는 서비스다.
이 서비스는 JavaScript, TypeScript 또는 Dart와 같은 언어를 사용하여 클라우드에서 코드를 실행할 수 있다. 따라서 Firebase Functions를 사용하면 클라이언트 애플리케이션이 직접 API를 호출하는 것이 아니라 함수를 호출하여 API 요청을 처리할 수 있다.
Firebase Hosting은 정적 파일 호스팅 서비스로, 정적 파일을 간단하게 호스팅하고 빠르게 전송할 수 있다.
Firebase Functions와 Firebase Hosting을 결합하면 Firebase Functions를 사용하여 API를 작성하고 Firebase Hosting을 사용하여 클라이언트에게 요청을 반환할 수 있다. Firebase Hosting은 정적 파일을 호스팅하기 때문에 클라이언트는 Firebase Functions의 엔드포인트를 직접 호출하지 않고도 API를 사용할 수 있다. Firebase Functions는 클라이언트에서 요청이 안되는 API를 처리하며, Firebase Hosting은 클라이언트에게 반환한다.
즉, Firebase Functions와 Firebase Hosting을 사용하면 클라이언트에서 요청이 안되는 API를 호스팅할 수 있으며, 서버 관리, 확장성, 비용 효율성 등의 장점을 제공한다.
프록시 서버의 정의
클라이언트가 서버에 직접 요청을 보내는 것이 아니라, 프록시 서버를 통해 요청을 전달하고, 프록시 서버가 서버로부터 응답을 받아 클라이언트에게 전달한다.
프록시 서버는 여러 가지 용도로 사용될 수 있다. 가장 일반적인 용도는 보안을 강화하고 사용자의 익명성을 보호하는 것이다. 예를 들어, 기업에서는 내부 네트워크에 접근하는 외부 사용자들을 위해 프록시 서버를 설치하여 내부 네트워크에 직접 접근하는 것을 방지한다. 또한, 프록시 서버를 사용하면 인터넷 사용 기록을 기록하고 제어할 수 있으며, 웹 필터링을 통해 사용자가 접근할 수 있는 웹 사이트를 제한할 수 있다.
또한, 프록시 서버는 캐싱을 사용하여 네트워크 대역폭을 절약할 수 있다. 클라이언트가 요청하는 웹 페이지나 파일 등의 정보를 프록시 서버에서 미리 캐시에 저장해두면, 클라이언트가 같은 정보를 다시 요청할 때는 서버로부터 정보를 받아올 필요 없이 캐시에서 바로 응답을 받을 수 있으므로 네트워크 대역폭을 줄일 수 있다.
또한, 프록시 서버를 사용하면 웹 필터링이나 보안 기능 등을 추가할 수 있으며, 로드 밸런싱이나 트래픽 관리 등의 기능도 수행할 수 있다.
파이어베이스 functions 와 hosting을 사용한 것도 프록시 서버 방식일까?
파이어베이스 Functions와 Hosting을 사용하여 클라이언트에서 요청이 안되는 API를 호스팅하는 것은 프록시 방식의 일종이다.
Firebase Functions은 클라이언트가 직접 서버에 요청을 보내지 않고, Firebase Hosting을 통해 요청을 전달하고, Functions가 서버로부터 응답을 받아 클라이언트에게 반환하기 때문이다. 이 과정에서 Firebase Hosting이 프록시 서버의 역할을 하게 된다.
하지만, 엄밀히 말하면 Firebase Functions과 Firebase Hosting은 프록시 서버라기보다는 서버리스(Serverless) 아키텍처를 사용한 서비스이다. 프록시 서버는 일반적으로 클라이언트와 서버 사이에 위치하여 중계하는 역할을 하지만, Firebase Functions와 Hosting은 클라우드 상에서 함수와 정적 파일을 호스팅하고, 이를 이용해 API 서비스를 구축하는 것으로, 프록시 서버의 역할을 한다기보다는 서비스 구축 방법 자체가 다르다고 볼 수 있다.