이번 장에서는 슬랙에서 웹 서버로 요청 시에 어떠한 data payload 를 보내는지와 사용자가 Slash Command 에 입력한 text 를 웹 서버에서 얻어보는 코드를 소개하려고 합니다.
https://api.slack.com/slash-commands 를 보면 Slash Command 를 호출하면 슬랙에서 data payload 와 어떤 유저가 요청을 했는지에 대한 정보를 제공한다고 나와 있습니다.
그리고 어떤 data payload 를 전달하는지에 대한 예도 나와 있습니다.
각각의 parameter 들에 대한 설명도 아래 사진처럼 슬랙에서 제공해줍니다. 저는 해당 paramter 들 중 text 만을 사용할 예정입니다.
또한, Slash Command 호출 후 정상적으로 호출이 됐다면 서버에서는 간단히 http status 200 응답을 보내면 됩니다. 만약 그렇지 않다면 슬랙에서 사용자에게 호출을 실패했다는 오류를 뱉습니다.
만약, 3초동안 슬랙에 응답이 없다면 사용자에게 Timeout was reached 라는 에러를 뱉습니다. 그리고 요청이 올바르지 않다면 에러를 반환하고 요청을 무시해야 합니다.
우선 이야기가 길어지니 자세한 내용은 해당 문서를 한 번 읽어봐주시면 감사하겠습니다.
위에서 요청이 올바르지 않다면 에러를 반환하고 요청을 무시해야 합니다.
라고 했는데 슬랙에서 보낸 요청인지, 누군가 임의적으로 보낸 요청인지 어떻게 확인하는가에 대해서 이야기를 해보려고 합니다.
https://api.slack.com/docs/verifying-requests-from-slack 에서 자세한 내용을 확인할 수 있습니다.
간단히 얘기하면 hmac 인증 기법을 사용하여 요청에 대한 유효성 검사를 할 수 있도록 해줍니다. 아래와 같은 식으로 처리를 해주려고 합니다.
■ 인층 처리 과정
1. 슬랙에서 앱에 대한 secret key 와 data payload 를 HMAC 알고리즘을 이용하여 hash 값을 만들어냅니다.
2. 생성한 hash 값과 data payload 를 http header 와 body 에 담아서 서버로 요청을 합니다.
3. 서버에서도 data payload 와 secret key 를 HMAC 알고리즘을 이용하여 hash 값을 만들어냅니다.
4. 슬랙에서 생성한 hash 값과 서버에서 생성한 hash 값을 비교하여 동일하면 올바른 요청이라고 판단하면 되고, 동일하지 않다면 비정상적인 요청이라고 판단합니다.
위와 같이 서버에서 처리를 해줄 예정입니다.
다음 장에서는 코드로 살펴보도록 하겠습니다.