I am maker

[설계, uml sequence diagram] 메일 수신 거부는 어떻게 구현할까? JWT를 활용해보자! email unsubscribe 본문

[설계, uml sequence diagram] 메일 수신 거부는 어떻게 구현할까? JWT를 활용해보자! email unsubscribe

코딩하는고릴라 2023. 2. 8. 21:36
반응형
이메일 수신거부

엄청 쌓이는 이메일....

특정 서비스의 이메일 수신 거부로 줄여보려고 눌렀는데
내가 로그인도 안했는데 내 이메일을 알고있더군요
사실 수신거부를 로그인하고해야하면, 너무 불편해서 아무도 메일 구독을 안할것 같긴해요.

그럼 어떻게 수신거부 처리를 하고있을지 역으로 생각해볼까요?
위 그림대로
1. 서버가 사용자에게 마케팅 이메일을 전송할 거에요
2. 사용자가 수신거부 url로 서버에 접속하면
3. 서버에서 사용자db에 수신 거부 처리를합니다.


이건 일반적으로 사용자가 인식할 때고 실제 개발에서 처리 할 때는
좀 더 구체화 해서 생각해보면
어떤 회원이 이메일을 수신거부 했는지 알기위해
특정 값이 필요합니다.
이 특정 값을 db를 이용한 key를 이용하면 아래 처럼 방법이 나올거에요

1. 서버에서 이메일을 전송하기 전에 사용자에 대한 key를 생성하여 db에 기록합니다.
2. 서버에서 만들어진 key와 email주소를 포함한 수신거부 url을 사용자에게 전송합니다.
3. 사용자가 이메일에 포함된 수신거부url에 접속하여 서버에 email과 key를 넘겨줍니다.
4. 서버에서 db에 key를 조회합니다.

5. 서버에서 db에 질의 결과에 따라서
- 6. 수신거부 처리
- 7. 올바르지 않은 호출이라고 사용자에게 알림

이런 프로세스로 작동하게 됩니다.

위 방법도 좋지만, 문제점은 key를 관리해줘야한다는 점 입니다.
key를 db에 저장하고 오래된걸 지워주는 이런 일련의 일들이요.

이걸 jwt를 사용한다면 db를 사용하지 않고 처리가 가능해집니다.

실제 수신거부가 가능한지 여부의 인증은 jwt에 달려있기 때문에, 아래와 같이 db에 질의하는 부분을 줄일 수 있고,
key를 위조하여 시도하는 호출 자체를 방지할 수 있습니다.

1. 서버에서 이메일을 전송하기 전에 사용자에 대한 jwt 생성
2. 서버에서 만들어진 jwt를 포함한 수신거부 url을 사용자에게 전송합니다.
3. 사용자가 이메일에 포함된 수신거부url에 접속하여 서버에 jwt를 넘겨줍니다.
4. 서버에서 jwt유효성을 체크합니다.
체크 결과에 따라서
- 5. 수신거부 처리
- 6. 올바르지 않은 호출이라고 사용자에게 알림


@startuml
'https://plantuml.com/sequence-diagram

autonumber

title 이메일 수신거부 db사용

actor 사용자
서버 -> db: 사용자별 key 생성 db 기록
서버 -> 사용자: 이메일 전송(수신거부 url[email, key])
사용자 -> 서버: 이메일에 포함된 수신거부 url 접속[email, key]
서버 -> db: 수신거부 가능여부 조회 [key]
db -> 서버: 수신거부 가능여부 응답
alt#Gold #LightBlue Successful case
    서버 -> db: 수신거부 처리
else #Pink Failure
    서버 -> 사용자: 올바르지 않은 호출
end

@enduml

@startuml
'https://plantuml.com/sequence-diagram

autonumber
title 이메일 수신거부 jwt 사용

actor 사용자
서버 -> 서버: 전송 대상에 대해 jwt 생성
서버 -> 사용자: 이메일 전송(수신거부 url jwt:{email, exp})
사용자 -> 서버: 이메일에 포함된 수신거부 url 접속 jwt:{email, exp}
서버 -> 서버: check jwt validate
alt#Gold #LightBlue Successful case
    서버 -> db: 수신거부 처리
else #Pink Failure
    서버 -> 사용자: 올바르지 않은 호출
end

@enduml
반응형