Pushapp

λͺ¨λ°”일 μ•± ν‘Έμ‹œ μ—°λ™ν•˜κΈ°

κ°œμš”

라이믹슀둜 λ§Œλ“  ν™ˆνŽ˜μ΄μ§€λŠ” μ›Ήλ·° 기반의 μ•±μ—μ„œ μ†μ‰½κ²Œ κΈ°κΈ°λ₯Ό λ“±λ‘ν•˜κ³  ν‘Έμ‹œ μ•Œλ¦Όμ„ 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
μ•„λž˜μ˜ μ„€λͺ…은 FCM κΈ°μ€€μž…λ‹ˆλ‹€.

μ‹œμŠ€ν…œ μ„€μ •

FCM을 μ‚¬μš©ν•˜λ €λ©΄ μ‹œμŠ€ν…œ μ„€μ • β†’ μ•Œλ¦Ό μ„€μ • λ©”λ‰΄μ—μ„œ FCM HTTP v1 APIλ₯Ό μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Firebase μ½˜μ†”μ—μ„œ λΉ„κ³΅κ°œ ν‚€λ₯Ό μƒμ„±ν•˜μ—¬ "FCM μ„œλΉ„μŠ€ 계정 파일" μž…λ ₯λž€μ— λΆ™μ—¬λ„£κ³  μ €μž₯ν•©λ‹ˆλ‹€.
이 νŒŒμΌμ—λŠ” μ•Œλ¦Ό λ°œμ†‘μ‹œ 인증에 μ‚¬μš©ν•˜λŠ” κ°œμΈν‚€λ₯Ό λΉ„λ‘―ν•˜μ—¬, ν”„λ‘œμ νŠΈ ID와 κ·Έ λ°–μ˜ 정보가 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
κ΄€λ¦¬μžκ°€ μ•„λ‹Œ μ‚¬λžŒμ—κ²Œ μ„œλΉ„μŠ€ 계정 파일이 λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ‹­μ‹œμ˜€.

κΈ°κΈ° 등둝

FCM을 톡해 device token을 λ°œκΈ‰λ°›μ€ 앱은, μ‚¬μš©μžκ°€ μ›Ήλ·° λ‚΄μ—μ„œ λ‘œκ·ΈμΈν•˜κ±°λ‚˜ νšŒμ›κ°€μž…ν•  λ•Œ
μ•„λž˜μ˜ 방법 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 토큰을 μ„œλ²„λ‘œ 전솑해야 ν•©λ‹ˆλ‹€.

  1. device_tokenμ΄λΌλŠ” POST λ³€μˆ˜
  2. device_tokenμ΄λΌλŠ” μΏ ν‚€
  3. X-Device-Tokenμ΄λΌλŠ” 헀더

λ‘œκ·ΈμΈμ€ actκ°€ procMemberLogin인 POST μš”μ²­μ„ μ˜λ―Έν•˜κ³ ,
νšŒμ›κ°€μž…μ€ actκ°€ procMemberInsert인 POST μš”μ²­μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ μš”μ²­μ„ ν•  λ•Œ μœ„μ˜ 3κ°€μ§€ 방법 쀑 ν•˜λ‚˜λ‘œ 토큰이 μ „λ‹¬λ˜κ³ , 둜그인 λ˜λŠ” νšŒμ›κ°€μž…μ— μ„±κ³΅ν•˜κ²Œ 되면,
λΌμ΄λ―ΉμŠ€λŠ” ν•΄λ‹Ή νšŒμ›μ˜ 계정에 토큰을 μžλ™μœΌλ‘œ λ“±λ‘ν•©λ‹ˆλ‹€.

[μ°Έκ³ ]
μœ„μ˜ 쑰건을 μΆ©μ‘±ν•˜λŠ” μΏ ν‚€λ‚˜ 헀더가 μ‘΄μž¬ν•˜λ”λΌλ„, 둜그인 λ˜λŠ” νšŒμ›κ°€μž… μ‹œμ  μ™Έμ—λŠ” μΈμ‹ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μ›Ήλ·° λ‚΄μ—μ„œ μΌμ–΄λ‚˜λŠ” μš”μ²­λ“€μ„ 일일이 μΆ”μ ν•˜κΈ° μ–΄λ €μš΄ ν™˜κ²½μ΄λΌλ©΄
λͺ¨λ“  μš”μ²­μ— μΏ ν‚€λ‚˜ 헀더λ₯Ό 일괄 μΆ”κ°€ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜μ—¬λ„ λ¬΄λ°©ν•©λ‹ˆλ‹€.
단, μ™ΈλΆ€ μ΄λ―Έμ§€λ‚˜ 슀크립트, 링크 등을 톡해 λ‹€λ₯Έ μ‚¬μ΄νŠΈμ— 접속할 λ•Œ 토큰이 λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

μ•Œλ¦Ό λ°œμ†‘

토큰이 λ“±λ‘λœ νšŒμ›μ΄ μ•Œλ¦Όμ„ λ°›μœΌλ©΄, ν•΄λ‹Ή νšŒμ›μ΄ λ“±λ‘ν•œ λͺ¨λ“  기기에 μžλ™μœΌλ‘œ ν‘Έμ‹œ μ•Œλ¦Όμ΄ λ°œμ†‘λ©λ‹ˆλ‹€.
일반적인 κ²Œμ‹œνŒ λŒ“κΈ€ μ•Œλ¦Ό, μͺ½μ§€ μ•Œλ¦Ό 등을 λͺ¨λ°”일 μ•±μœΌλ‘œ λ°œμ†‘ν•˜κΈ° μœ„ν•΄
μœ„μ—μ„œ μ–ΈκΈ‰ν•œ μ‹œμŠ€ν…œ μ„€μ • 외에 λ³„λ„μ˜ μž‘μ—…μ΄ ν•„μš”ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

일반적인 μ•Œλ¦Ό 외에 λ°±μ—”λ“œμ—μ„œ μž„μ˜λ‘œ μ•Œλ¦Όμ„ μƒμ„±ν•˜λ €λ©΄
NcenterliteController 클래슀의 sendNotification() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
μž„μ˜μ˜ URL을 μ§€μ •ν•˜κ±°λ‚˜, 제λͺ©κ³Ό λ‚΄μš©μ„ 각각 μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜κ±°λ‚˜, λ³„λ„μ˜ 데이터λ₯Ό λ„£μ–΄μ„œ μ „λ‹¬ν•˜λŠ” λ“±,
일반적인 μ•Œλ¦Όμ—μ„œ μ§€μ›λ˜μ§€ μ•ŠλŠ” λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€.

μ•Œλ¦Ό μˆ˜μ‹ 

토큰을 λ“±λ‘ν•œ 앱은 μžμ‹ μ—κ²Œ μ „λ‹¬λ˜λŠ” FCM μ•Œλ¦Όμ„ 일반적인 λ°©λ²•μœΌλ‘œ μˆ˜μ‹ ν•©λ‹ˆλ‹€.

μ•Œλ¦Όμ„Όν„°μ˜ "ν‘Έμ‹œ μ•Œλ¦Ό 포맷" 섀정에 따라
μ•„λž˜μ™€ 같은 두 κ°€μ§€ 포맷 쀑 ν•˜λ‚˜λ‘œ μ•Œλ¦Όμ΄ μ „μ†‘λ˜λ‹ˆ,
μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν•„μš”μ— λ§žλŠ” 포맷을 μ„ νƒν•˜μ—¬ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

notification μ‚¬μš© (κΈ°μ‘΄ 포맷)
notification: {
    title: "λΌμ΄λ―ΉμŠ€λ‹˜μ΄ νšŒμ›λ‹˜μ˜ 글에 'ν…ŒμŠ€νŠΈ'라고 λŒ“κΈ€μ„ λ‚¨κ²ΌμŠ΅λ‹ˆλ‹€.",
},
data: {
    url: "ν΄λ¦­μ‹œ λ°©λ¬Έν•  URL"
}
data μ‚¬μš© (μ‹ κ·œ 포맷)
data: {
    sender: "μž‘μ„±μž λ‹‰λ„€μž„",
    profile_image: "μž‘μ„±μž ν”„λ‘œν•„ 이미지 URL",
    type: "C",  // μ•Œλ¦Ό λ°œμƒ μ‚¬μœ μ— 따라 D, C, V λ“±
    subject: "λΌμ΄λ―ΉμŠ€λ‹˜μ΄ νšŒμ›λ‹˜μ˜ 글에 'ν…ŒμŠ€νŠΈ'라고 λŒ“κΈ€μ„ λ‚¨κ²ΌμŠ΅λ‹ˆλ‹€.",
    content: "",  // 일반적으둜 λΉ„μ–΄ μžˆμœΌλ‚˜, sendNotification() μ‚¬μš©μ‹œ μ»€μŠ€ν„°λ§ˆμ΄μ§• κ°€λŠ₯
    url: "ν΄λ¦­μ‹œ λ°©λ¬Έν•  URL"
}

κ³ κΈ‰ ν™œμš©

둜그인 λ˜λŠ” νšŒμ›κ°€μž… μ‹œμ μ΄ μ•„λ‹ˆλ”λΌλ„, μ•„λž˜μ˜ APIλ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°κΈ°λ₯Ό λ“±λ‘ν•˜κ³  둜그인 μƒνƒœλ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κΈ°κΈ° 등둝 API

member λͺ¨λ“ˆμ˜ procMemberRegisterDevice μ•‘μ…˜μ— μ•„λž˜μ˜ λ³€μˆ˜λ“€μ„ POST둜 μ œμΆœν•©λ‹ˆλ‹€.

  • user_id (아이디 λ˜λŠ” 이메일 μ£Όμ†Œ)
  • password
  • device_token

인증에 μ„±κ³΅ν•˜λ©΄ ν•΄λ‹Ή νšŒμ›μ˜ 계정에 κΈ°κΈ°κ°€ λ“±λ‘λ˜κ³ , device_keyκ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.

μžλ™ 둜그인 API

νšŒμ›μ˜ μ•„μ΄λ””λ‚˜ 이메일 μ£Όμ†Œ, λΉ„λ°€λ²ˆν˜Έ 등을 μ•±μ—μ„œ κΈ°μ–΅ν•˜μ§€ μ•Šκ³  μ•ˆμ „ν•˜κ²Œ λ‘œκ·ΈμΈμ„ μœ μ§€ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

member λͺ¨λ“ˆμ˜ procMemberLoginWithDevice μ•‘μ…˜μ— μ•„λž˜μ˜ λ³€μˆ˜λ“€μ„ POST둜 μ œμΆœν•©λ‹ˆλ‹€.

  • device_token
  • device_key

μœ νš¨ν•œ νšŒμ› 계정에 device_tokenκ³Ό μΌμΉ˜ν•˜λŠ” κΈ°κΈ°κ°€ λ“±λ‘λ˜μ–΄ 있고,
ν•΄λ‹Ή κΈ°κΈ°λ₯Ό 등둝할 λ•Œ λ°˜ν™˜ν–ˆλ˜ device_keyκ°€ μΌμΉ˜ν•œλ‹€λ©΄ 둜그인이 λ©λ‹ˆλ‹€.
이것을 μ‚¬μš©ν•˜λ©΄ μ„œλ²„μ˜ μ„Έμ…˜ μœ μ§€ κΈ°κ°„μ΄λ‚˜ νšŒμ›μ˜ λΉ„λ°€λ²ˆν˜Έ λ³€κ²½κ³Ό 관계없이
μ•±μ—μ„œ 항상 둜그인 μƒνƒœλ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

둜그인 μƒνƒœ 확인 API

μœ„μ˜ μžλ™ 둜그인 APIλ₯Ό μ‚¬μš©ν•˜κΈ° μ „, ν˜„μž¬ 둜그인이 λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

member λͺ¨λ“ˆμ˜ getLoginStatus μ•‘μ…˜μ„ POST둜 ν˜ΈμΆœν•©λ‹ˆλ‹€.

λ‘œκ·ΈμΈλ˜μ–΄ μžˆλ‹€λ©΄ ν•΄λ‹Ή νšŒμ›μ˜ κ³ μœ κ°’μ„ λ°˜ν™˜ν•˜κ³ , λ‘œκ·ΈμΈλ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ none을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
이것을 ν™œμš©ν•˜μ—¬ 둜그인이 ν’€λ Έκ±°λ‚˜, κΈ°κΈ°λ₯Ό λ“±λ‘ν–ˆλ˜ 아이디와 λ‹€λ₯Έ μ•„μ΄λ””λ‘œ λ‘œκ·ΈμΈν•œ μƒνƒœμΈμ§€ ν™•μΈν•˜κ³ ,
ν•„μš”μ— 따라 적절히 λŒ€μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Όμ˜μ‚¬ν•­

μœ„μ˜ λͺ¨λ“  μš”μ²­μ€ μ›Ήλ·°μ—μ„œ μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•œ μ„Έμ…˜ μΏ ν‚€, user-agent 등을 μ‚¬μš©ν•˜μ—¬ μš”μ²­ν•΄μ•Ό ν•˜κ³ ,
μ„œλ²„μ—μ„œ μΏ ν‚€λ₯Ό λ°˜ν™˜ν•  경우 웹뷰에 μ •ν™•ν•˜κ²Œ 전달해야 ν•©λ‹ˆλ‹€.
웹뷰와 λ³„λ„λ‘œ λ„€μ΄ν‹°λΈŒ λΆ€λΆ„μ—μ„œ HTTP clientλ₯Ό μƒμ„±ν•˜μ—¬ μ‚¬μš©ν•  경우, μΏ ν‚€κ°€ μ„œλ‘œ λ™κΈ°ν™”λ˜μ§€ μ•Šκ±°λ‚˜,
일뢀 μΏ ν‚€ 속성이 μ •ν™•ν•˜κ²Œ μ „λ‹¬λ˜μ§€ μ•Šμ•„ μ˜€μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

POST λ°©μ‹μ˜ λͺ¨λ“  μš”μ²­μ€ λ°±μ—”λ“œμ—μ„œ CSRF 체크λ₯Ό κ±°μΉ©λ‹ˆλ‹€.
각 μ‚¬μ΄νŠΈμ˜ λ³΄μ•ˆ 섀정에 따라 μ•„λž˜μ˜ 두 κ°€μ§€ 방법 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜μ—¬ CSRF 체크λ₯Ό ν†΅κ³Όν•˜λ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  1. Referer 헀더에 μ‚¬μ΄νŠΈ λ‚΄λΆ€ μ£Όμ†Œ(예: 메인화면 μ£Όμ†Œ)λ₯Ό 전솑
  2. X-CSRF-token 헀더에 CSRF 토큰을 전솑

λ§Œμ•½ CSRF 토큰을 μ‚¬μš©ν•  경우, μœ„μ—μ„œ μ„€λͺ…ν•œ 둜그인 μƒνƒœ 확인 APIλ₯Ό μ‚¬μš©ν•˜μ—¬
ν˜„μž¬ μ„Έμ…˜μ—μ„œ μœ νš¨ν•œ 토큰을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.
(둜그인 μƒνƒœ 확인 APIλ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” λ¦¬νΌλŸ¬λ‚˜ CSRF 토큰이 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)