Skip to content

๐ŸŒ ์›น ํ†ตํ•ฉ ํŠธ๋ž™ โ€‹

Next.js ยท Rails ยท Express ๋“ฑ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์›น ์•ฑ์—์„œ logi ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ.

์ด ํŠธ๋ž™์ด ๋งž๋‚˜์š”?

  • โœ… ๋งž์Œ: ๋ฐฑ์—”๋“œ๊ฐ€ ์žˆ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘์†ํ•˜๋Š” ์›น ์„œ๋น„์Šค
  • โŒ ๋ชจ๋ฐ”์ผ ์•ฑ ์ด๋ผ๋ฉด โ†’ ๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ์•ฑ ํ†ตํ•ฉ ํŠธ๋ž™
  • โŒ ์ˆœ์ˆ˜ SPA (๋ฐฑ์—”๋“œ ์—†์Œ) ์ด๋ผ๋ฉด โ†’ Public Client + PKCE. public-clients ์ฐธ๊ณ 
  • โŒ ๋ฐ์Šคํฌํ†ฑ SSO (Apple / Google ID ํ† ํฐ ์ง์ˆ˜์‹ ) ์ด๋ผ๋ฉด โ†’ Web SSO (๋ฐ์Šคํฌํ†ฑ)

ํ•ต์‹ฌ ์•ฝ์† 4์ค„ โ€‹

  1. Confidential client + client_secret ์„œ๋ฒ„ ๋ณด๊ด€. ์ ˆ๋Œ€ ๋ธŒ๋ผ์šฐ์ € ๋ฒˆ๋“ค์— ๋…ธ์ถœ ๊ธˆ์ง€.
  2. redirect_uri ๋Š” https://... ๋˜๋Š” http://localhost โ€” ์„œ๋ฒ„ ์ฝœ๋ฐฑ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ.
  3. state + nonce ๊ฒ€์ฆ + HttpOnly ยท Secure ์ฟ ํ‚ค ๋กœ ์„ธ์…˜ ๋ฐœ๊ธ‰.
  4. ์•ฑ RP ์™€ ์›น RP ๋Š” ๋ถ„๋ฆฌ โ€” ์ž์„ธํžˆ: ๊ณตํ†ต/Public Clients ยท Surface ๋ณ„ RP ๋ถ„๋ฆฌ

Step 1 ยท ์•ฑ ๋“ฑ๋ก โ€‹

  • SPA / ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ โ†’ client_type: public ์œผ๋กœ RP ๋“ฑ๋ก (PKCE-only, secret ์—†์Œ).

  • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ (Next.js / Rails / Express) โ†’ client_type: confidential ๋กœ RP ๋“ฑ๋ก โ†’ client_id + client_secret ๋ฐœ๊ธ‰.

  • ์•ฑ ๋“ฑ๋ก ๊ฐ€์ด๋“œ

  • Public vs Confidential ๊ฒฐ์ •

Step 2 ยท ํ†ตํ•ฉ ํŒจํ„ด โ€‹

SPA / ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ (๊ถŒ์žฅ) โ€‹

์ˆœ์ˆ˜ SPA (๋ฐฑ์—”๋“œ ์ฝœ๋ฐฑ ์—†์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ํ† ํฐ ๊ตํ™˜) ๋ผ๋ฉด ๊ณต์‹ SDK @logi-auth/browser@0.1.0 ์‚ฌ์šฉ:

bash
npm install @logi-auth/browser
ts
import { LogiAuth } from '@logi-auth/browser';

const auth = new LogiAuth({
  clientId: 'logi_xxx',
  redirectUri: window.location.origin + '/auth/callback',
});

// Page A โ€” ๋กœ๊ทธ์ธ ์‹œ์ž‘
await auth.signIn();

// Page B โ€” ์ฝœ๋ฐฑ ํŽ˜์ด์ง€
const tokens = await auth.handleCallback();

์ž์„ธํ•œ API + ์—๋Ÿฌ ๋ถ„๋ฅ˜ โ†’ SPA Quickstart

์„œ๋ฒ„ ์‚ฌ์ด๋“œ (Next.js / Rails / Express) โ€‹

์„œ๋ฒ„์—์„œ client_secret ๋ณด๊ด€ + ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ. logi ๋Š” ํ‘œ์ค€ OIDC discovery (https://api.1pass.dev/.well-known/openid-configuration) ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜ OIDC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ โ€” oauth4webapi, openid-client, next-auth, auth.js โ€” ๊ฐ€ issuer: 'https://api.1pass.dev' ๋งŒ์œผ๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์Šคํƒ๊ฐ€์ด๋“œํ•ต์‹ฌ
Next.js (App Router)integrations/nextjsRoute Handler + iron-session ํŒจํ„ด
Rails 8integrations/railsDirect OAuth ํด๋ผ์ด์–ธํŠธ (omniauth ๋ฏธ์‚ฌ์šฉ). โš ๏ธ Hotwire/Turbo ์‚ฌ์šฉ ์‹œ data-turbo="false" ํ•„์ˆ˜
Express.jsintegrations/expresscookieParser + crypto PKCE

Step 3 ยท ์›น ํŠนํ™” ํ•จ์ • ํ”ผํ•˜๊ธฐ โ€‹

โš ๏ธ ๊ธฐ์กด ๋ชจ๋ฐ”์ผ RP ์— ์›น surface ์ถ”๊ฐ€ ์‹œ redirect_uri ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ฐฑ์‹  ํ•„์ˆ˜

ํ•˜๋‚˜์˜ client_id ๋ฅผ ๋ชจ๋ฐ”์ผ ์•ฑ๊ณผ ์›น surface ๊ฐ€ ๊ณต์œ ํ•˜๋ฉด (public + PKCE RP ๋ผ๋ฉด ์•ˆ์ „), ์›น ์ฝœ๋ฐฑ URL ๋„ RP ์˜ redirect_uris ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ๋ช…์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ ์‹œ logi ๋Š” ์ฆ‰์‹œ ๊ฑฐ์ ˆ:

json
{ "error": "invalid_request", "error_description": "redirect_uri not registered" }

์›น ๋นŒ๋“œ ์‹œ์ž‘ ์ „ ๋ฐ˜๋“œ์‹œ:

bash
# ํ˜„์žฌ ๋“ฑ๋ก๋œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ํ™•์ธ
logi app show $CLIENT_ID
# ๋ˆ„๋ฝ์ด๋ฉด ์ถ”๊ฐ€ (๊ธฐ์กด URI ์œ ์ง€ํ•˜๊ณ  append ํ•จ)
logi app update $CLIENT_ID --add-redirect-uri "https://app.example.dev/auth/1pass/callback"
# preview/staging ๋„๋ฉ”์ธ์ด ์žˆ๋‹ค๋ฉด ๊ฐ™์ด ๋“ฑ๋ก
logi app update $CLIENT_ID --add-redirect-uri "https://preview.example.dev/auth/1pass/callback"
# ๊ฒ€์ฆ
logi apps verify $CLIENT_ID -r "https://app.example.dev/auth/1pass/callback"

์ด ํ•จ์ •์€ โ€œ์ด๋ฏธ ๋ชจ๋ฐ”์ผ๋กœ ๋“ฑ๋ก๋œ RP ์— ์›น ํ๋ฆ„์„ ์ƒˆ๋กœ ๋ถ™์ผ ๋•Œโ€ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‹ ๊ทœ RP ๋ผ๋ฉด ์•ฑ ๋“ฑ๋ก ๊ฐ€์ด๋“œ ์˜ redirect_uris ๋ฐฐ์—ด์— ๋ชจ๋“  surface ์˜ ์ฝœ๋ฐฑ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ ๋ฒˆ์— ๋“ฑ๋กํ•˜์„ธ์š”.

Step 4 ยท ๋นŒ๋“œ ์ „ ์ฒดํฌ โ€‹

๊ณตํ†ต ๋ ˆํผ๋Ÿฐ์Šค (ํŠธ๋ž™ ๋ฌด๊ด€) โ€‹


AI ์—๊ฒŒ ํ†ต์งธ๋กœ ๋˜์ง€๊ธฐ โ€‹

@/llms-full.txt ๋ฅผ Claude Code ยท Cursor ยท Codex ์— ๋ถ™์ด๊ณ  ๋‹ค์Œ ํ•œ ์ค„:

"logi 1pass ๋ฅผ [Next.js / Rails / Express] ์›น ์•ฑ์— RP ๋กœ ํ†ตํ•ฉํ•ด์ค˜. confidential client + ์„œ๋ฒ„ ๋ณด๊ด€ secret ๊ธฐ์ค€."

โ†’ env, route, controller, callback handler, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ UI ๊นŒ์ง€ ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

MIT License ยท Identity๊ฐ€ ์ œํ’ˆ์˜ ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.