MQTT로 카톡서버 만들어보자 - 1/10. Pub/Sub으로 로그인?

빙고리우스·2024년 3월 15일
5
post-thumbnail

Pub/Sub으로 로그인 만들라굽쇼

웹서비스 로그인은 전형적인 방식이 있다.
POST로

{
  id:"hong_gil_dong",
  pw:"password1234",
  ...
}

을 날리면 서버가 DB에서 비번 맞춰보고 맞으면 로그인 아니면 우리집에 왜 왔니? 하면 된다.

그런데 이건 웹 프로그램 짤 때고...
Pub/Sub Broker 세상에서는 어떻게 하지?😒😒

Broker 세상은 그렇게 돌아가는게 아녀

다 아는 얘기 한번 해보자.
Broker 방식은 복덕방하고 똑같다.
방구하러 온 사람이 떡방 할배에게 말한다.

여기 현대빌라 203혼데요, 저희 이번에 나가서 집 내놔요. 방 3개고 재작년에 지은 신축이예요.
전번은 010-1234-5678이고, 제가 일을 해서 집은 저녁 7시 이후 보여줄 수 있어요.

집 내 놓는다는 말이다.
유식하게 이를 pub 이라 한다.

2인 가족이 살건데요.
채광 좋고, 단독 전세 나오면 연락해주세요.

집 구하니, 연락 달라는 말이다.
유식하게 sub이라 한다.

떡방 할배가 장부 뒤져 그런 집이 있으면 이분한테 연락한다.
pub 날리는거다.

어, 할배가 sub도 받고, pub도 날리고 혼자 다하네.☎☎

이제 pub/sub이 방향의 문제임을 눈치챘을 것이다.
sub한 놈한테 pub하는거다.

pub 받을려면 sub해 놔야한다.
같은 말이다.😁😁

자 이제 로그인 문제로 돌아와보자.

위 그림은 login 요청하고, login 응답하는거다.

Broker는 둘만 있는 세상이 아니다.
Broker 한테 로그인 처리 해달라고 하면 화낸다.
웹서버 방식이 아니라, 쉽지 않다.

오똑케하면 이 문제를 해결할 것인가?

물론 Broker 자체에 로그인 기능이 있지만, 그건 떡방 할배 사무실 이름이랑 전번이다.
우리가 원하는 건, DB에 있는 사용자 정보에 접근해서 거기랑 맞춰보는거다.
2

Client/Server 방식은 쉽지 ㅎ

떡방 아저씨 입장에선 모두가 client다.
집을 구하는 사람도 client고, 집을 내놓는 사람도 cleint다.
왜?
둘 다 돈을 주니까...😁😁😁
왓어 원더플 월더 다.

Broker 세상에는 client만 있고, server 는 없다.

다들 돈 낸는 client라고 일은 안하고, 다리 꼬고 앉아 있다.
누가 로그인 처리할 것인가? 방법이 없을까?

있다.
client 중 한 놈을 패서 server로 만들자.

그냥 그 client 이름을 server라 붙이면 된다. 인자부터 니가 server 해👊👊👊

진실의 방을 다녀오고 나면 다음과 같이 고분고분해진다.

  1. sub server/login : server/login으로 들어오는 건 내가 처리할께😢
  2. pub server/login : server님, 저 login할래요😄

됐다.
borker로 server/client 만들었다.
사실 한 놈 뚜까 패서 server 시켰다.😁😁😁😁😁😁

이제 server가 비번 맞춰보고 login 해줄지 말지 응답하면 된다.
자, 이제 User는 login 응답만 받으면 된다.
엥. 근데 응답 콜은 어떻게 받지?

맛집 앞에서 줄만 잘 선다고 끝 아니다.
아무리 기다려도 안 부를 수 있다.

뒤에 온 놈이 먼저 들어가는 더러운 꼴 볼 수 있단 말이다.
대기책자📝에 이름이랑 전번 써놔야 여친한테 사랑💏받는다.

Broker 세상도 마찬가지다.
응답 콜 받겠다고 미리 등록(sub)해야 한다.

  1. sub server/login : server/login으로 들어오는 건 내가 처리할께
  2. sub clients/client1 : 결과는 clients/client1 로 주세요
  3. pub server/login : server님, 저 login할래요
  4. pub clients/client1 : clients/client1 DB에 있는 패스워드랑 다른데...너 누구냐?

Broker는 왼손으로 요청 받아서, 오른손으로 전달해주는 역할을 한다.
내용에는 관심없다.
거의 예수님, 부처님 수준이다.
다만 어떤 놈이 어떤 것 받아 본다고 했더라(sub) 하는 놓은 노트📝 한권 들고 있다.

누가 뭘 구독하고 있는지?

또 있다. sub하는 놈들이 여럿일 수 있으니

누가 지금 연결되어 있는지

주기적으로 체크✅도 한다. 변심하고 딴 맛집 간 놈 없는지...

어떤 놈은 가면 간다 말을 하기도 한다.
이걸 유식하게 LWT라 한다. 나중에 나온다.

글 쓰는 이가 그냥 설렁설렁 대충 주절거리는 것 같지만, 나름 깊은 뜻이 쪼금 있다.

여기까지 온다고 고생들 했다.
이제 코드로 함 만들어 보자.
그래도 명색이 프로_글래머💪인데.

client.js

const mqtt = require("mqtt");
const client = mqtt.connect("mqtt://localhost");

const user = { id: 'client1', pwd: 'pwd' };

client.on("connect", () => {
    client.subscribe("clients/client1");
    client.publish("server/login", JSON.stringify(user));
});

client.on("message", (topic, message) => {
    console.log(message.toString());
    client.end();
});

예외 처리 왜 안하냐구?

할 줄 몰라서 안한다고 생각하면, 당신은 천재다.
그런 거는 나중에 돈 받고 만들 때 하면 된다.
괜히 Code Reading만 어렵더라.

server.js

const mqtt = require("mqtt");
const server = mqtt.connect("mqtt://localhost");

server.on("connect", () => {
    server.subscribe("server/login");
});

server.on("message", (topic, message) => {
    let data = JSON.parse(message);
    let client_topic = 'clients/' + data.id;
    if (data.pwd === 'pwd') {
        let res = { msg: 'login ok' };
        server.publish(client_topic, JSON.stringify(res));
    } else {
        let res = { msg: 'login fail' };
        server.publish(client_topic, JSON.stringify(res));
    }
});

떡방이라고 했다가 혼났다.
부동산중계인


- 복덕방 사진: 페이스북 '사진으로 보는 코리아'
- 마동석 사진: 영화 '시동'
profile
다할줄아는 사람보다 뭔가 한가지 똑부러지게하는 사람이되자.

4개의 댓글

comment-user-thumbnail
2024년 3월 27일

재밌는 그림으로 쉽게 설명해주시니 어려워도 웃으며 따라가네요.
감사합니다.

1개의 답글
comment-user-thumbnail
2024년 5월 16일

글 재밋게 잘쓰시네요 . 연재 하시면 분명 큰 인기얻으실거에요

1개의 답글