OAuth란?
OAuth는 자원 소유자(구글, 카카오, 페이스북, 슬랙)와 HTTP 서비스 간의 승인 상호 작용을 조정하거나 제 3자 애플리케이션이 스스로 액세스를 얻음으로써 자원 소유자의 서비스에 대한 제한된 액세스를 얻을 수 있는 인증 프레임워크이다.
흔히 볼 수 있는 구글 로그인, 카카오 로그인은 OAuth를 통해서 해당 서비스에 가입한 사용자의 정보를 일련의 과정을 통해서 제 3자 애플리케이션이 접근할 수 있도록 해서 회원가입을 생략하고 서비스를 이용할 수 도 있다.
또한 OAuth와 슬랙에서 제공하는 api를 사용하여 슬랙이 아닌 내가 만든 웹에서 슬랙에 메세지를 보내는 등 자원 소유자가 제공하는 서비스를 제 3자 애플리케이션에서 사용할 수도 있다.
OAuth는 크게 Access Token과 Scope로 이루어져 있다고 볼 수 있다.
Slack API에서 OAuth를 사용하는 방식과 OAuth를 통해서 얻은 Access Token을 사용하는 방식은 다음과 같다.
Slack에서 OAuth로 Access Token 받기
자원 소유자의 자원(서비스)를 이용하기 위해서는 Access Token이 필요한데, 슬랙에서 OAuth를 사용해서 api를 사용하는 방식은 다음과 같다.
- scope에 대한 요청을 하면 code를 반환한다.
- 받은 code를 통해서 access token을 교환 받는다.
- 받은 access token을 이용해 slack api를 사용한다.
oauth/v2/authorize
먼저 어떤 사용자가 어떤 서비스를 이용할지에 대해서 정하고 이에대한 code를 받는 api 이다. 이 과정에서 사용자는 해당 서비스의 로그인을 하게되고, 사용하게 될 권한에 대해서 안내를 받고 동의를 하게 된다.(Authorization Request)
자원 소유자는 해당 요청(Authrization Request)을 받아서 확인을 하고 유효한 요청이라면 이를 승인하고 일련의 코드를 보내게 된다.(Authorization Grant)
https://slack.com/oauth/v2/authorize?scope=incoming-webhook,commands&client_id=3336676.569200954261&redirect_uri=example.com
scope - 사용할 api가 요구하는 scope들(권한)
client_id - 사용하려는 워크스페이스에 앱을 만들면 얻을 수 있다.
redirect_uri - 해당 요청이 완료되면 redirect될 주소
사용자가 위 링크를 클릭하면 슬랙 로그인 화면으로 이동하게 되고, 로그인을 하게되면, 해당 scope에 대한 안내를 받고 허용하는 화면이 나오게 된다.
위 과정을 통해 사용자의 로그인과 허가를 받게 되면 redirect_uri로 리다이렉트된다.
oauth.v2.access
oauth/v2/authorize과정이 완료되면 코드와 함께 리다이렉트 되는데, 이떄 해당 컨트롤러에서 토큰을 교환하는 로직을 추가하기만 하면된다.
curl -F code=1234 -F client_id=3336676.569200954261 -F client_secret=ABCDEFGH https://slack.com/api/oauth.v2.access
code - oauth/v2/authorize에서 받은 임시 권한 코드
client_id, client_secret - 앱을 만들면 얻을 수 있는 코드(권한을 요청한 워크스페이스 앱)
위 요청을 보내면 아래와 같은 response를 받을 수 있고, 내가 요청한 권한과 그에 맞는 access_token을 받을 수 있고 이를 사용해서 슬랙 api를 사용할 수 있다.
{
"ok": true,
"access_token": "xoxb-17653672481-19874698323-pdFZKVeTuE8sk7oOcBrzbqgy",
"token_type": "bot",
"scope": "commands,incoming-webhook",
"bot_user_id": "U0KRQLJ9H",
"app_id": "A0KRD7HC3",
"team": {
"name": "Slack Softball Team",
"id": "T9TK3CUKW"
},
"enterprise": {
"name": "slack-sports",
"id": "E12345678"
},
"authed_user": {
"id": "U1234",
"scope": "chat:write",
"access_token": "xoxp-1234",
"token_type": "user"
}
}
마무리
사실 회사에서 사내 시스템에서 슬랙 메세지를 발송하는 기능을 추가하게 되서 공식 문서를 보면서 정리한 문서이다 보니 내가 이해하고 사용한? 부분만 적은 것 같다… 공식 문서가 너무 자세히 잘 정리되어 있어서 부족한 부분은 공식 문서를 보고 구현하면 될 것 같다.
이번에 기능을 추가하면서 slack api 공식문서와 oauth2 공식문서를 엄청 많이 봤다. 왜 사람들이 공식 문서를 보고 개발하는지 알게되었다. 내가 원하는 기능을 똑같이 구현한 블로그는 존재하지 않는다…로그인밖에 없다…
참고 자료
slack oauth2 - https://api.slack.com/authentication/oauth-v2
slack sign in with slack - https://api.slack.com/authentication/sign-in-with-slack
OAuth - https://oauth.net/2/
'Back-end' 카테고리의 다른 글
ElastAlert (1) | 2024.06.09 |
---|---|
웹서버(Web Server)와 웹 어플리케이션 서버(Web Application Server) (0) | 2023.06.25 |
[HTTP] 응답 상태 코드 정리 (0) | 2021.09.14 |
[REST API]REST API란? (0) | 2021.08.29 |
[WEB] HTTPS와 SSL인증서 (0) | 2021.08.29 |