프로젝트/슬랙봇

슬랙봇 개발기 ① - 소켓 모드란 무엇일까?

뽀글보리 2022. 12. 11. 12:49
반응형

슬랙봇을 개발할 경우에는 HTTP통신을 기반으로 하거나 웹소켓 통신을 기반으로 하는 두가지 방법이 있다.

먼저 HTTP 통신을 기반으로 하는 방법은 public으로 열어놓은 REST API를 기반으로 하는 방법이다.

이를 위해선 퍼블릭 도메인을 하나 파야하고, 서버를 그 도메인으로 띄워야한다.

슬랙봇에서 커맨드를 입력할 때마다 해당 URL로 POST 요청이 전달해지는 방식일 것이다.

요것은 슬랙 커맨드 입력창인데, 해당 커맨드를 사용할 때마다

적어놓은 RequestURL로 요청이 간다고 보면 된다.

 

그러나 이러한 HTTP 통신 방식의 단점

- 퍼블릭 도메인을 생성해야 하므로, 보안상 위험할 수 있다는 점이다.

- 또한 사내망이나 방화벽 내에서 통신하는 슬랙봇을 만들기 위해서는 이러한 방식은 불가능하다.

 

따라서 이러한 경우에는 슬랙의 소켓 모드를 사용하여 웹소켓 기반 통신을 하는 것이 적합하다.

웹소켓 통신을 위해서는 슬랙봇 세팅에서 Enable Socket Mode를 On으로 바꾸어야 한다.

그러면 이렇게 app-level token을 만드라고 나오는 데,

connections:write scope이 포함된 app-level token을 만든다.

생성된 토큰은

Basic Information 메뉴의 - All-Level Tokens에서도 확인할 수 있다.

요렇게 토큰을 만든 후에,

apps.connections.open 기능을 해당 토큰으로 요청하게 되면

슬랙에서는 그때그때마다 다른 동적 websocket url을 생성한다.

{
    "ok": true,
    "url": "wss://wss-somethiing.slack.com/link/?ticket=12348&app_id=5678"
}

바로 요런식으로 websocket url을 만들어서 응답을 내려주게 되고,

요 url을 통해서 웹 소켓 통신을 시도하면 된다.

{
   "type":"hello",
   "num_connections":2,
   "debug_info":{
      "host":"applink-0","build_number":20,"approximate_connection_time":18060
   },
   "connection_info":{"app_id":"A043UN2AVB3"}
}

연결이 성공했을 경우에는 다음과 같은 메시지가 전달된다.

++Rcv raw: b'\x89\x13Ping from applink-0'
++Rcv decoded: fin=1 opcode=9 data=b'Ping from applink-0'
++Sent raw: b'\x8a\x93\xfb*\x08\xce\xabCf\xa9\xdbLz\xa1\x96\ni\xbe\x8bFa\xa0\x90\x078'
++Sent decoded: fin=1 opcode=10 data=b'Ping from applink-0'
++Sent raw: b'\x89\x80\x0f\x02\xf6I'
++Sent decoded: fin=1 opcode=9 data=b''

그리고 주기적인 ping interval마다 확인하면서 서버가 잘 살아있다는 것을 확인한다.

웹소켓은 양방향 통신이 기반이기 때문에,

슬랙 서버로부터 메시지를 전달 받을 때마다 ack을 전송해야 한다.

 

더 자세한 내용을 알고 싶다면

https://api.slack.com/apis/connections/socket-implement

반응형