use Revolution\Bluesky\Facades\Bluesky;use Revolution\Bluesky\Session\LegacySession;use Revolution\Bluesky\Session\OAuthSession;// App PasswordBluesky::login(config('bluesky.identifier'), config('bluesky.password'));// 또는 OAuth$session = OAuthSession::create(session('bluesky_session'));Bluesky::withToken($session);// ↓ 이후의 API 호출은 완전히 공통 ↓Bluesky::post('Hello Bluesky');Bluesky::getTimeline();Bluesky::getProfile();Bluesky::searchPosts(q: '#laravel');
BlueskyManager는 내부에서 LegacyAgent 또는 OAuthAgent를 나눠 사용하지만, 호출 측 코드에는 영향을 주지 않습니다.
망설여질 때는 목적별로 나누는 것이 가장 알기 쉽습니다. “앱이 스스로 동작”한다면 App Password, “사용자가 조작”한다면 OAuth입니다. 두 가지를 조합하는 것도 가능하며, 알림에는 App Password를 사용하고 사용자 로그인에는 OAuth를 사용하는 구성도 자주 볼 수 있습니다.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Knowledge of Laravel","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146","dark":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/dark.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=a8a0340d86ff8aa90e9adfc98a0362d7","href":"/"},"favicon":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/favicon.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=8f5a03a681c95d31803fc237b5811065","api":{"playground":{"display":"simple"}},"navbar":{},"footer":{"socials":{"github":"https://github.com/invokable"}},"seo":{"metatags":{"canonical":"https://kawax.biz"},"indexing":"all"},"styling":{"eyebrows":"breadcrumbs","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":false},"metadata":{"timestamp":true},"navigation":{"languages":[{"language":"jp","default":true,"href":"jp/packages/laravel-boost-copilot-cli"},{"language":"en","href":"en/packages/laravel-boost-copilot-cli"},{"language":"de","href":"de/packages/laravel-boost-copilot-cli"},{"language":"es","href":"es/packages/laravel-boost-copilot-cli"},{"language":"fr","href":"fr/packages/laravel-boost-copilot-cli"},{"language":"it","href":"it/packages/laravel-boost-copilot-cli"},{"language":"ko","href":"ko/packages/laravel-boost-copilot-cli"},{"language":"nl","href":"nl/packages/laravel-boost-copilot-cli"},{"language":"zh-Hans","href":"zh-CN/packages/laravel-boost-copilot-cli"},{"language":"zh-Hant","href":"zh-TW/packages/laravel-boost-copilot-cli"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"invokable","hasAudioNarration":true,"actualSubdomain":"invokable","customDomains":["kawax.biz"],"gitSource":{"type":"github","owner":"kawax","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af4f8bb899645a1d83de491","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"en","tag":"My Packages","count":145},{"language":"jp","tag":"マイパッケージ","count":145},{"language":"de","tag":"Meine Pakete","count":100},{"language":"es","tag":"Mis paquetes","count":100},{"language":"fr","tag":"Mes packages","count":100},{"language":"it","tag":"I miei pacchetti","count":100},{"language":"ko","tag":"My 패키지","count":100},{"language":"nl","tag":"Mijn packages","count":100},{"language":"zh-Hans","tag":"我的包","count":100},{"language":"zh-Hant","tag":"我的套件","count":100},{"language":"de","tag":"Fortgeschrittene Themen","count":82},{"language":"en","tag":"Advanced Topics","count":82},{"language":"es","tag":"Temas avanzados","count":82},{"language":"fr","tag":"Sujets avancés","count":82},{"language":"it","tag":"Argomenti avanzati","count":82},{"language":"jp","tag":"応用トピック","count":82},{"language":"ko","tag":"심화 주제","count":82},{"language":"nl","tag":"Geavanceerde onderwerpen","count":82},{"language":"zh-Hans","tag":"进阶主题","count":82},{"language":"zh-Hant","tag":"進階主題","count":82},{"language":"en","tag":"VOICEVOX","count":67},{"language":"jp","tag":"VOICEVOX","count":67},{"language":"de","tag":"Leitfaden","count":61},{"language":"en","tag":"Guide","count":61},{"language":"es","tag":"Guía","count":61},{"language":"fr","tag":"Guide","count":61},{"language":"it","tag":"Guida","count":61},{"language":"jp","tag":"ガイド","count":61},{"language":"ko","tag":"가이드","count":61},{"language":"nl","tag":"Gids","count":61},{"language":"zh-Hans","tag":"指南","count":61},{"language":"zh-Hant","tag":"指南","count":61},{"language":"de","tag":"Blog","count":47},{"language":"en","tag":"Blog","count":47},{"language":"es","tag":"Blog","count":47},{"language":"fr","tag":"Blog","count":47},{"language":"it","tag":"Blog","count":47},{"language":"jp","tag":"ブログ","count":47},{"language":"ko","tag":"블로그","count":47},{"language":"nl","tag":"Blog","count":47},{"language":"zh-Hans","tag":"博客","count":47},{"language":"zh-Hant","tag":"部落格","count":47},{"language":"en","tag":"VOICEVOX Engine API Reference","count":45},{"language":"jp","tag":"VOICEVOXエンジンAPIリファレンス","count":45},{"language":"de","tag":"Paketentwicklung","count":43},{"language":"de","tag":"GitHub Copilot","count":43},{"language":"en","tag":"Package Development","count":43},{"language":"en","tag":"GitHub Copilot","count":43},{"language":"es","tag":"Desarrollo de paquetes","count":43},{"language":"es","tag":"GitHub Copilot","count":43},{"language":"fr","tag":"Développement de packages","count":43},{"language":"fr","tag":"GitHub Copilot","count":43},{"language":"it","tag":"Sviluppo di pacchetti","count":43},{"language":"it","tag":"GitHub Copilot","count":43},{"language":"jp","tag":"パッケージ開発","count":43},{"language":"jp","tag":"GitHub Copilot","count":43},{"language":"ko","tag":"패키지 개발","count":43},{"language":"ko","tag":"GitHub Copilot","count":43},{"language":"nl","tag":"Package-ontwikkeling","count":43},{"language":"nl","tag":"GitHub Copilot","count":43},{"language":"zh-Hans","tag":"包开发","count":43},{"language":"zh-Hans","tag":"GitHub Copilot","count":43},{"language":"zh-Hant","tag":"套件開發","count":43},{"language":"zh-Hant","tag":"GitHub Copilot","count":43},{"language":"de","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"en","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"es","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"fr","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"it","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"jp","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"ko","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"nl","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hans","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hant","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"de","tag":"Tutorial","count":35},{"language":"en","tag":"Tutorial","count":35},{"language":"es","tag":"Tutorial","count":35},{"language":"fr","tag":"Tutoriel","count":35},{"language":"it","tag":"Tutorial","count":35},{"language":"jp","tag":"チュートリアル","count":35},{"language":"ko","tag":"튜토리얼","count":35},{"language":"nl","tag":"Tutorial","count":35},{"language":"zh-Hans","tag":"教程","count":35},{"language":"zh-Hant","tag":"教學","count":35},{"language":"de","tag":"SDK","count":27},{"language":"es","tag":"SDK","count":27},{"language":"fr","tag":"SDK","count":27},{"language":"it","tag":"SDK","count":27},{"language":"ko","tag":"SDK","count":27},{"language":"nl","tag":"SDK","count":27},{"language":"zh-Hans","tag":"SDK","count":27},{"language":"zh-Hant","tag":"SDK","count":27},{"language":"de","tag":"VOICEVOX","count":22},{"language":"es","tag":"VOICEVOX","count":22},{"language":"fr","tag":"VOICEVOX","count":22},{"language":"it","tag":"VOICEVOX","count":22},{"language":"ko","tag":"VOICEVOX","count":22},{"language":"nl","tag":"VOICEVOX","count":22},{"language":"zh-Hans","tag":"VOICEVOX","count":22},{"language":"zh-Hant","tag":"VOICEVOX","count":22}],"searchSettings":{"isFiltersEnabled":false,"showContentSnippets":true,"fullPageSearch":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"ko/packages/laravel-bluesky/authentication","slug":"/ko/packages/laravel-bluesky/authentication","pageMetadata":{"title":"인증 방식 비교 - Laravel Bluesky","description":"Laravel Bluesky의 App Password(LegacyAgent)와 OAuth(OAuthAgent)의 차이, 내부 아키텍처, 코드 예시를 설명합니다.","sidebarTitle":"인증 방식 비교","href":"/ko/packages/laravel-bluesky/authentication"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Laravel Bluesky의 App Password(LegacyAgent)와 OAuth(OAuthAgent)의 차이, 내부 아키텍처, 코드 예시를 설명합니다.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Info,Mermaid,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`개요`,children:`개요`}),`\n`,_jsx(_components.p,{children:`Laravel Bluesky는 두 가지 인증 방식을 지원합니다. 인증 이후의 API 호출은 두 방식 모두 공통입니다.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`항목`}),_jsx(_components.th,{children:`App Password`}),_jsx(_components.th,{children:`OAuth`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`내부 클래스`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`LegacyAgent`}),` / `,_jsx(_components.code,{children:`LegacySession`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`OAuthAgent`}),` / `,_jsx(_components.code,{children:`OAuthSession`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`진입점`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Bluesky::login()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Bluesky::withToken(OAuthSession)`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`비밀 키`}),_jsx(_components.td,{children:`불필요`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`BLUESKY_OAUTH_PRIVATE_KEY`}),`가 필요`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`사용자의 인가 조작`}),_jsx(_components.td,{children:`불필요`}),_jsx(_components.td,{children:`필요(브라우저에서 승인)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`백그라운드 실행`}),_jsx(_components.td,{children:`✅ 적합`}),_jsx(_components.td,{children:`✅ 가능(refresh_token을 저장)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`세션 키`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`accessJwt`}),` / `,_jsx(_components.code,{children:`refreshJwt`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`access_token`}),` / `,_jsx(_components.code,{children:`refresh_token`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`폐지 예정`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`없음`})}),_jsx(_components.td,{children:`—`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`주 용도`}),_jsx(_components.td,{children:`자동 게시·알림·배치 처리`}),_jsx(_components.td,{children:`사용자 대리 조작·Socialite 연동`})]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`LegacyAgent`}),`라는 명칭은 “OAuth 이전의 인증 방식”을 의미하지만, App Password 자체는 폐지 예정이 아닙니다. 알림이나 자동 게시 등 사용자 조작이 필요 없는 상황에서는 App Password가 더 단순하고 적합합니다.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`아키텍처`,children:`아키텍처`}),`\n`,_jsx(Mermaid,{chart:`classDiagram\n class BlueskyManager {\n +login(identifier, password) Factory\n +withToken(session) Factory\n +agent() Agent\n +check() bool\n +refreshSession() Factory\n }\n class LegacyAgent {\n +session LegacySession\n +http() PendingRequest\n +refreshSession() self\n }\n class OAuthAgent {\n +session OAuthSession\n +http() PendingRequest\n +refreshSession() self\n }\n class LegacySession {\n +accessJwt\n +refreshJwt\n +did\n +handle\n +token() string\n +refresh() string\n }\n class OAuthSession {\n +access_token\n +refresh_token\n +did\n +iss\n +token() string\n +refresh() string\n +issuer() string\n }\n\n BlueskyManager --> LegacyAgent : login()\n BlueskyManager --> OAuthAgent : withToken(OAuthSession)\n BlueskyManager --> LegacyAgent : withToken(LegacySession)\n LegacyAgent --> LegacySession : holds\n OAuthAgent --> OAuthSession : holds`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`BlueskyManager`}),`는 Facade `,_jsx(_components.code,{children:`Bluesky`}),`의 실체입니다. `,_jsx(_components.code,{children:`login()`}),` 또는 `,_jsx(_components.code,{children:`withToken()`}),`으로 에이전트를 설정하고, 이후의 API 호출은 두 인증 방식 모두 동일한 메서드를 사용합니다.`]}),`\n`,_jsx(Heading,{level:`2`,id:`app-password-legacyagent`,children:`App Password (LegacyAgent)`}),`\n`,_jsx(Heading,{level:`3`,id:`인증-흐름`,children:`인증 흐름`}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n participant App as Laravel 앱\n participant Bluesky as Bluesky 서버\n\n App->>Bluesky: createSession(identifier, password)\n Bluesky-->>App: LegacySession (accessJwt + refreshJwt)\n App->>App: LegacyAgent::create(session)\n App->>Bluesky: API 호출 (Bearer accessJwt)\n Bluesky-->>App: 응답\n Note over App: accessJwt가 만료된 경우\n App->>Bluesky: refreshSession (refreshJwt)\n Bluesky-->>App: 새로운 accessJwt + refreshJwt`}),`\n`,_jsx(Heading,{level:`3`,id:`blueskylogin`,children:`Bluesky::login()`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`.env`}),`에 App Password를 설정하고 `,_jsx(_components.code,{children:`login()`}),`을 호출하기만 하면 됩니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`dotenv`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`dotenv`,children:_jsxs(_components.code,{language:`dotenv`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`BLUESKY_IDENTIFIER`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`your-handle.bsky.social`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`BLUESKY_APP_PASSWORD`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`xxxx-xxxx-xxxx-xxxx`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$response`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`login`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` identifier`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.identifier'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` password`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.password'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hello Bluesky'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`legacysession의-재사용`,children:`LegacySession의 재사용`}),`\n`,_jsxs(_components.p,{children:[`매번 `,_jsx(_components.code,{children:`login()`}),`을 호출하면 매번 API 요청이 발생합니다. 세션을 캐시하여 재사용하면 더 효율적입니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`20`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`20`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`LegacySession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 최초 로그인 후 세션을 저장`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`login`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` identifier`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.identifier'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` password`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.password'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`put`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky_session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`agent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toArray`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(), `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`addDay`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 다음 실행부터는 캐시에서 복원`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` LegacySession`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky_session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, []));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`withToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 액세스 토큰이 만료되었다면 갱신`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`check`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`refreshSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$response`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hello from cached session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`legacysession의-주요-키`,children:`LegacySession의 주요 키`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`키`}),_jsx(_components.th,{children:`내용`}),_jsx(_components.th,{children:`메서드`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`accessJwt`})}),_jsx(_components.td,{children:`액세스 토큰`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`token()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`refreshJwt`})}),_jsx(_components.td,{children:`리프레시 토큰`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`refresh()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`did`})}),_jsx(_components.td,{children:`Bluesky DID`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`did()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`handle`})}),_jsx(_components.td,{children:`핸들`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`handle()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`email`})}),_jsx(_components.td,{children:`이메일 주소`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`email()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`active`})}),_jsx(_components.td,{children:`계정이 활성 상태인지`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`active()`})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`적합한-사용-사례`,children:`적합한 사용 사례`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`백그라운드 잡·큐 처리에서의 자동 게시`}),`\n`,_jsx(_components.li,{children:`Laravel Notification 채널을 사용한 알림`}),`\n`,_jsx(_components.li,{children:`배치 처리·스케줄링`}),`\n`,_jsx(_components.li,{children:`애플리케이션 자신의 계정으로 게시하는 경우`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`oauth-oauthagent`,children:`OAuth (OAuthAgent)`}),`\n`,_jsx(Heading,{level:`3`,id:`인증-흐름-2`,children:`인증 흐름`}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n participant User as 사용자\n participant App as Laravel 앱\n participant Bluesky as Bluesky 서버\n\n User->>App: 로그인 폼 전송(핸들 입력)\n App->>Bluesky: PAR 요청(login_hint 포함)\n Bluesky-->>App: request_uri\n App->>Bluesky: 인가 엔드포인트로 리디렉트\n User->>Bluesky: Bluesky에서 로그인 승인\n Bluesky-->>App: 콜백(code + iss)\n App->>Bluesky: DPoP를 사용한 토큰 교환\n Bluesky-->>App: OAuthSession (access_token + refresh_token)\n App->>User: 로그인 완료\n App->>Bluesky: API 호출 (DPoP access_token)\n Bluesky-->>App: 응답`}),`\n`,_jsx(Heading,{level:`3`,id:`blueskywithtoken`,children:`Bluesky::withToken()`}),`\n`,_jsxs(_components.p,{children:[`Socialite로 취득한 `,_jsx(_components.code,{children:`OAuthSession`}),`을 `,_jsx(_components.code,{children:`withToken()`}),`에 전달합니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OAuthSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Laravel 세션에서 복원(Web 요청)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OAuthSession`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky_session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$timeline`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`withToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getTimeline`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`백그라운드 잡이나 Console에서도 DB에 저장한 값으로 `,_jsx(_components.code,{children:`OAuthSession`}),`을 구성할 수 있습니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OAuthSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OAuthSession`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`([`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'did'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $user`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`did`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'refresh_token'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $user`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`refresh_token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // bsky.social 이외의 계정은 iss도 지정`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // 'iss' => $user->iss,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]);`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$response`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`withToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`refreshSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hello from OAuth'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`oauthsession의-주요-키`,children:`OAuthSession의 주요 키`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`키`}),_jsx(_components.th,{children:`내용`}),_jsx(_components.th,{children:`메서드`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`access_token`})}),_jsx(_components.td,{children:`액세스 토큰`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`token()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`refresh_token`})}),_jsx(_components.td,{children:`리프레시 토큰(1회만 사용 가능)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`refresh()`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`did`}),` / `,_jsx(_components.code,{children:`sub`})]}),_jsx(_components.td,{children:`Bluesky DID`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`did()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`iss`})}),_jsx(_components.td,{children:`인가 서버 URL`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`issuer()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`profile.handle`})}),_jsx(_components.td,{children:`핸들`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`handle()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`profile.displayName`})}),_jsx(_components.td,{children:`표시 이름`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`displayName()`})})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`OAuth의 refresh_token은 한 번밖에 사용할 수 없습니다. `,_jsx(_components.code,{children:`OAuthSessionUpdated`}),` 이벤트를 사용하여 토큰 갱신 후에는 반드시 DB를 업데이트하세요. 자세한 내용은 `,_jsx(_components.a,{href:`/ko/packages/laravel-bluesky/socialite`,children:`Socialite`}),`를 참조하세요.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`적합한-사용-사례-2`,children:`적합한 사용 사례`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Socialite를 사용한 사용자 로그인`}),`\n`,_jsx(_components.li,{children:`사용자를 대신하여 API를 호출하는 조작`}),`\n`,_jsx(_components.li,{children:`사용자별로 다른 계정으로 조작해야 하는 경우`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`인증-이후의-api-호출은-공통`,children:`인증 이후의 API 호출은 공통`}),`\n`,_jsxs(_components.p,{children:[`두 인증 방식 모두 `,_jsx(_components.code,{children:`withToken()`}),` 이후에는 동일한 API 메서드를 사용합니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`LegacySession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OAuthSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// App Password`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`login`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.identifier'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.password'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 또는 OAuth`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OAuthSession`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky_session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`withToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// ↓ 이후의 API 호출은 완전히 공통 ↓`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hello Bluesky'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getTimeline`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getProfile`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`searchPosts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`q`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'#laravel'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`BlueskyManager`}),`는 내부에서 `,_jsx(_components.code,{children:`LegacyAgent`}),` 또는 `,_jsx(_components.code,{children:`OAuthAgent`}),`를 나눠 사용하지만, 호출 측 코드에는 영향을 주지 않습니다.`]}),`\n`,_jsx(Heading,{level:`2`,id:`어느-쪽을-선택해야-하는가`,children:`어느 쪽을 선택해야 하는가`}),`\n`,_jsx(Mermaid,{chart:`flowchart TD\n A[\"어느 인증 방식을 사용할까?\"] --> B{\"사용자가 Bluesky 계정으로\u003cbr>로그인해야 하는가?\"}\n B -->|\"예\"| C[\"OAuth (OAuthAgent)\u003cbr>Socialite 연동\"]\n B -->|\"아니오\"| D{\"앱 자신의 계정으로\u003cbr>조작하는가?\"}\n D -->|\"예\"| E[\"App Password (LegacyAgent)\u003cbr>단순하고 운용하기 쉬움\"]\n D -->|\"여러 사용자의 대리 조작\"| C`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`상황`}),_jsx(_components.th,{children:`권장`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`자동 게시·알림·배치`}),_jsx(_components.td,{children:`App Password`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`사용자 로그인 기능`}),_jsx(_components.td,{children:`OAuth`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`백그라운드 잡만 사용`}),_jsx(_components.td,{children:`App Password`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`사용자 대리 조작이 필요`}),_jsx(_components.td,{children:`OAuth`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`운용의 단순함을 우선`}),_jsx(_components.td,{children:`App Password`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`보안·권한 제어 중시`}),_jsx(_components.td,{children:`OAuth`})]})]})]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`망설여질 때는 목적별로 나누는 것이 가장 알기 쉽습니다. “앱이 스스로 동작”한다면 App Password, “사용자가 조작”한다면 OAuth입니다. 두 가지를 조합하는 것도 가능하며, 알림에는 App Password를 사용하고 사용자 로그인에는 OAuth를 사용하는 구성도 자주 볼 수 있습니다.`})}),`\n`,_jsx(Heading,{level:`2`,id:`참고-링크`,children:`참고 링크`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ko/packages/laravel-bluesky/basic-client`,children:`Basic client`}),` — 인증 후의 API 조작`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ko/packages/laravel-bluesky/socialite`,children:`Socialite`}),` — OAuth 흐름의 상세`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ko/packages/laravel-bluesky/notification`,children:`알림 채널`}),` — App Password / OAuth를 사용한 알림`]}),`\n`,_jsxs(_components.li,{children:[`Source: `,_jsx(_components.a,{href:`https://github.com/invokable/laravel-bluesky`,children:`invokable/laravel-bluesky`})]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"인증 방식 비교 - Laravel Bluesky","description":"Laravel Bluesky의 App Password(LegacyAgent)와 OAuth(OAuthAgent)의 차이, 내부 아키텍처, 코드 예시를 설명합니다.","sidebarTitle":"인증 방식 비교","href":"/ko/packages/laravel-bluesky/authentication"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"개요","slug":"개요","depth":2,"children":[]},{"title":"아키텍처","slug":"아키텍처","depth":2,"children":[]},{"title":"App Password (LegacyAgent)","slug":"app-password-legacyagent","depth":2,"children":[{"title":"인증 흐름","slug":"인증-흐름","depth":3,"children":[]},{"title":"Bluesky::login()","slug":"blueskylogin","depth":3,"children":[]},{"title":"LegacySession의 재사용","slug":"legacysession의-재사용","depth":3,"children":[]},{"title":"LegacySession의 주요 키","slug":"legacysession의-주요-키","depth":3,"children":[]},{"title":"적합한 사용 사례","slug":"적합한-사용-사례","depth":3,"children":[]}]},{"title":"OAuth (OAuthAgent)","slug":"oauth-oauthagent","depth":2,"children":[{"title":"인증 흐름","slug":"인증-흐름-2","depth":3,"children":[]},{"title":"Bluesky::withToken()","slug":"blueskywithtoken","depth":3,"children":[]},{"title":"OAuthSession의 주요 키","slug":"oauthsession의-주요-키","depth":3,"children":[]},{"title":"적합한 사용 사례","slug":"적합한-사용-사례-2","depth":3,"children":[]}]},{"title":"인증 이후의 API 호출은 공통","slug":"인증-이후의-api-호출은-공통","depth":2,"children":[]},{"title":"어느 쪽을 선택해야 하는가","slug":"어느-쪽을-선택해야-하는가","depth":2,"children":[]},{"title":"참고 링크","slug":"참고-링크","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"narration":{"path":"ko/packages/laravel-bluesky/authentication","locale":"ko","estimatedDurationSec":247},"subdomain":"invokable","siteName":"Knowledge of Laravel","title":"인증 방식 비교 - Laravel Bluesky - Knowledge of Laravel","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"jp":{"href":"/jp/packages/laravel-bluesky/authentication","matchLevel":1},"en":{"href":"/en/packages/laravel-bluesky/authentication","matchLevel":1},"de":{"href":"/de/packages/laravel-bluesky/authentication","matchLevel":1},"es":{"href":"/es/packages/laravel-bluesky/authentication","matchLevel":1},"fr":{"href":"/fr/packages/laravel-bluesky/authentication","matchLevel":1},"it":{"href":"/it/packages/laravel-bluesky/authentication","matchLevel":1},"ko":{"href":"/ko/packages/laravel-bluesky/authentication","matchLevel":0},"nl":{"href":"/nl/packages/laravel-bluesky/authentication","matchLevel":1},"zh-Hans":{"href":"/zh-CN/packages/laravel-bluesky/authentication","matchLevel":1},"zh-Hant":{"href":"/zh-TW/packages/laravel-bluesky/authentication","matchLevel":1}}},"lastModified":"2026-07-13T21:16:50.265Z","gitLastModified":"2026-07-13T21:15:13.000Z","originalFileLocation":"ko/packages/laravel-bluesky/authentication.mdx","locale":"ko"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Laravel Bluesky의 App Password(LegacyAgent)와 OAuth(OAuthAgent)의 차이, 내부 아키텍처, 코드 예시를 설명합니다.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"인증 방식 비교 - Laravel Bluesky - Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:description\" content=\"Laravel Bluesky의 App Password(LegacyAgent)와 OAuth(OAuthAgent)의 차이, 내부 아키텍처, 코드 예시를 설명합니다.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://kawax.biz/ko/packages/laravel-bluesky/authentication\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://invokable.mintlify.site/_mintlify/api/og/v2?division=Laravel+Bluesky\u0026amp;title=%EC%9D%B8%EC%A6%9D+%EB%B0%A9%EC%8B%9D+%EB%B9%84%EA%B5%90+-+Laravel+Bluesky\u0026amp;description=Laravel+Bluesky%EC%9D%98+App+Password%28LegacyAgent%29%EC%99%80+OAuth%28OAuthAgent%29%EC%9D%98+%EC%B0%A8%EC%9D%B4%2C+%EB%82%B4%EB%B6%80+%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%2C+%EC%BD%94%EB%93%9C+%EC%98%88%EC%8B%9C%EB%A5%BC+%EC%84%A4%EB%AA%85%ED%95%A9%EB%8B%88%EB%8B%A4.\u0026amp;theme=cef70bdc0dd1884481ab7c5d\u0026amp;signature=c2140ac0e6b9516813c4081aac3460863c5778c2bb68279b117c85779fddf6a5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"인증 방식 비교 - Laravel Bluesky - Knowledge of Laravel\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Laravel Bluesky의 App Password(LegacyAgent)와 OAuth(OAuthAgent)의 차이, 내부 아키텍처, 코드 예시를 설명합니다.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://invokable.mintlify.site/_mintlify/api/og/v2?division=Laravel+Bluesky\u0026amp;title=%EC%9D%B8%EC%A6%9D+%EB%B0%A9%EC%8B%9D+%EB%B9%84%EA%B5%90+-+Laravel+Bluesky\u0026amp;description=Laravel+Bluesky%EC%9D%98+App+Password%28LegacyAgent%29%EC%99%80+OAuth%28OAuthAgent%29%EC%9D%98+%EC%B0%A8%EC%9D%B4%2C+%EB%82%B4%EB%B6%80+%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%2C+%EC%BD%94%EB%93%9C+%EC%98%88%EC%8B%9C%EB%A5%BC+%EC%84%A4%EB%AA%85%ED%95%A9%EB%8B%88%EB%8B%A4.\u0026amp;theme=cef70bdc0dd1884481ab7c5d\u0026amp;signature=c2140ac0e6b9516813c4081aac3460863c5778c2bb68279b117c85779fddf6a5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://kawax.biz/ko/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/ko/packages/laravel-bluesky/authentication.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://kawax.biz/ko/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://kawax.biz/jp/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://kawax.biz/en/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://kawax.biz/de/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://kawax.biz/es/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://kawax.biz/fr/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://kawax.biz/it/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"nl\" href=\"https://kawax.biz/nl/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hans\" href=\"https://kawax.biz/zh-CN/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hant\" href=\"https://kawax.biz/zh-TW/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://kawax.biz/jp/packages/laravel-bluesky/authentication\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://kawax.biz/#organization\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146\"}},{\"@type\":\"WebSite\",\"@id\":\"https://kawax.biz#website\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://kawax.biz/ko/packages/laravel-bluesky/authentication#webpage\",\"url\":\"https://kawax.biz/ko/packages/laravel-bluesky/authentication\",\"name\":\"인증 방식 비교 - Laravel Bluesky\",\"description\":\"Laravel Bluesky의 App Password(LegacyAgent)와 OAuth(OAuthAgent)의 차이, 내부 아키텍처, 코드 예시를 설명합니다.\",\"dateModified\":\"2026-07-13T21:15:13.000Z\",\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"},\"breadcrumb\":{\"@id\":\"https://kawax.biz/ko/packages/laravel-bluesky/authentication#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://kawax.biz/ko/packages/laravel-bluesky/authentication#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"SDK\",\"item\":\"https://kawax.biz/ko/packages/laravel-bluesky\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel Bluesky\",\"item\":\"https://kawax.biz/ko/packages/laravel-bluesky\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"인증 방식 비교 - Laravel Bluesky\",\"item\":\"https://kawax.biz/ko/packages/laravel-bluesky/authentication\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://kawax.biz/ko/packages/laravel-bluesky/authentication#article\",\"headline\":\"인증 방식 비교 - Laravel Bluesky\",\"name\":\"인증 방식 비교 - Laravel Bluesky\",\"description\":\"Laravel Bluesky의 App Password(LegacyAgent)와 OAuth(OAuthAgent)의 차이, 내부 아키텍처, 코드 예시를 설명합니다.\",\"url\":\"https://kawax.biz/ko/packages/laravel-bluesky/authentication\",\"mainEntityOfPage\":{\"@id\":\"https://kawax.biz/ko/packages/laravel-bluesky/authentication#webpage\"},\"dateModified\":\"2026-07-13T21:15:13.000Z\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"},\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Knowledge of Laravel\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Knowledge of Laravel\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/ko/packages/laravel-bluesky/authentication.md","siteName":"Knowledge of Laravel","nav":{"global":null,"languages":[{"language":"jp","default":true,"pages":[{"title":"jp","href":"/jp/packages/laravel-bluesky/authentication"}]},{"language":"en","pages":[{"title":"en","href":"/en/packages/laravel-bluesky/authentication"}]},{"language":"de","pages":[{"title":"de","href":"/de/packages/laravel-bluesky/authentication"}]},{"language":"es","pages":[{"title":"es","href":"/es/packages/laravel-bluesky/authentication"}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/packages/laravel-bluesky/authentication"}]},{"language":"it","pages":[{"title":"it","href":"/it/packages/laravel-bluesky/authentication"}]},{"language":"ko","tabs":[{"tab":"My 패키지","groups":[{"group":"GitHub Copilot","pages":[{"title":"Laravel Boost Custom Agent for GitHub Copilot CLI","href":"/ko/packages/laravel-boost-copilot-cli"},{"title":"Laravel Boost Custom Agent for PhpStorm with GitHub Copilot","href":"/ko/packages/laravel-boost-phpstorm-copilot"},{"group":"GitHub Copilot SDK for Laravel","expanded":false,"pages":[{"title":"GitHub Copilot SDK for Laravel","href":"/ko/packages/laravel-copilot-sdk/index"},{"title":"시작하기 - GitHub Copilot SDK for Laravel","sidebarTitle":"시작하기","href":"/ko/packages/laravel-copilot-sdk/getting-started"},{"title":"인증 - GitHub Copilot SDK for Laravel","sidebarTitle":"인증","href":"/ko/packages/laravel-copilot-sdk/auth"},{"title":"SessionConfig","href":"/ko/packages/laravel-copilot-sdk/session-config"},{"title":"권한 요청","href":"/ko/packages/laravel-copilot-sdk/permission-request"},{"title":"SessionEvent","href":"/ko/packages/laravel-copilot-sdk/session-event"},{"title":"RPC(Remote Procedure Call)","href":"/ko/packages/laravel-copilot-sdk/rpc"},{"title":"모델","href":"/ko/packages/laravel-copilot-sdk/models"},{"title":"세션 재개","href":"/ko/packages/laravel-copilot-sdk/resume"},{"title":"세션 AI 크레딧 한도","href":"/ko/packages/laravel-copilot-sdk/session-limits"},{"title":"도구","href":"/ko/packages/laravel-copilot-sdk/tools"},{"title":"Ask user","href":"/ko/packages/laravel-copilot-sdk/ask-user"},{"title":"MCP","href":"/ko/packages/laravel-copilot-sdk/mcp"},{"title":"세션 훅","href":"/ko/packages/laravel-copilot-sdk/hooks"},{"title":"Skills","href":"/ko/packages/laravel-copilot-sdk/skills"},{"title":"Plugin Directories","href":"/ko/packages/laravel-copilot-sdk/plugin-directories"},{"title":"커스텀 에이전트","href":"/ko/packages/laravel-copilot-sdk/custom-agents"},{"title":"Fleet Mode","href":"/ko/packages/laravel-copilot-sdk/fleet-mode"},{"title":"에이전트 루프","href":"/ko/packages/laravel-copilot-sdk/agent-loop"},{"title":"이벤트","href":"/ko/packages/laravel-copilot-sdk/events"},{"title":"send()와 on()","href":"/ko/packages/laravel-copilot-sdk/send-on"},{"title":"스트리밍","href":"/ko/packages/laravel-copilot-sdk/streaming"},{"title":"스트리밍 이벤트","href":"/ko/packages/laravel-copilot-sdk/streaming-events"},{"title":"Attachments","href":"/ko/packages/laravel-copilot-sdk/attachments"},{"title":"테스트 - GitHub Copilot SDK for Laravel","sidebarTitle":"테스트","href":"/ko/packages/laravel-copilot-sdk/fake"},{"title":"Laravel Cloud - GitHub Copilot SDK for Laravel","sidebarTitle":"Laravel Cloud","href":"/ko/packages/laravel-copilot-sdk/laravel-cloud"},{"title":"GitHub Actions - GitHub Copilot SDK for Laravel","sidebarTitle":"GitHub Actions","href":"/ko/packages/laravel-copilot-sdk/github-actions"},{"title":"GitHub 토큰","href":"/ko/packages/laravel-copilot-sdk/github-token"},{"title":"Laravel AI SDK 연동","href":"/ko/packages/laravel-copilot-sdk/ai-sdk"},{"title":"Copilot CLI 번들","href":"/ko/packages/laravel-copilot-sdk/bundle-cli"},{"title":"TCP 모드","href":"/ko/packages/laravel-copilot-sdk/tcp-mode"},{"title":"Remote Sessions","href":"/ko/packages/laravel-copilot-sdk/remote-sessions"},{"title":"Cloud Sessions","href":"/ko/packages/laravel-copilot-sdk/cloud-sessions"},{"title":"AHP Host","href":"/ko/packages/laravel-copilot-sdk/ahp"},{"title":"세션 컨텍스트와 필터링","href":"/ko/packages/laravel-copilot-sdk/session-context"},{"title":"세션 라이프사이클 이벤트","href":"/ko/packages/laravel-copilot-sdk/session-lifecycle-event"},{"title":"Telemetry","href":"/ko/packages/laravel-copilot-sdk/telemetry"},{"title":"커스텀 프로바이더","href":"/ko/packages/laravel-copilot-sdk/custom-providers"},{"title":"Concurrency","href":"/ko/packages/laravel-copilot-sdk/concurrency"},{"title":"스티어링과 큐잉","href":"/ko/packages/laravel-copilot-sdk/steering"},{"title":"공식 SDK 호환 레이어 사용법","href":"/ko/packages/laravel-copilot-sdk/bare-usage"}]}]},{"group":"SDK","pages":[{"group":"Laravel Bluesky","expanded":false,"pages":[{"title":"Laravel Bluesky","href":"/ko/packages/laravel-bluesky/index"},{"title":"Basic client - Laravel Bluesky","sidebarTitle":"Basic client","href":"/ko/packages/laravel-bluesky/basic-client"},{"title":"봇 튜토리얼 - Laravel Bluesky","sidebarTitle":"봇 튜토리얼","href":"/ko/packages/laravel-bluesky/bot-tutorial"},{"title":"TextBuilder","description":"Bluesky의 리치 텍스트(facets)를 PHP로 구축하기 위한 TextBuilder 클래스의 상세한 사용법.","href":"/ko/packages/laravel-bluesky/text-builder"},{"title":"인증 방식 비교 - Laravel Bluesky","sidebarTitle":"인증 방식 비교","href":"/ko/packages/laravel-bluesky/authentication"},{"title":"Socialite - Laravel Bluesky","description":"Laravel Bluesky의 OAuth 인증. AT Protocol 고유의 DPoP·PAR 엔드포인트를 사용한 Socialite 설정과 사용법.","sidebarTitle":"Socialite","href":"/ko/packages/laravel-bluesky/socialite"},{"title":"알림 채널 - Laravel Bluesky","sidebarTitle":"알림 채널","href":"/ko/packages/laravel-bluesky/notification"},{"title":"테스트","href":"/ko/packages/laravel-bluesky/testing"},{"title":"Identity","href":"/ko/packages/laravel-bluesky/identity"},{"title":"라우트","href":"/ko/packages/laravel-bluesky/route"},{"title":"검증(Verify)","href":"/ko/packages/laravel-bluesky/verify"},{"title":"Feed Generator","href":"/ko/packages/laravel-bluesky/feed-generator"},{"title":"Labeler","href":"/ko/packages/laravel-bluesky/labeler"},{"title":"BlueskyManager와 HasShortHand","href":"/ko/packages/laravel-bluesky/bluesky-manager"},{"title":"WebSocket (Jetstream / Firehose)","href":"/ko/packages/laravel-bluesky/websocket"},{"title":"Crypto — AT Protocol 암호화","href":"/ko/packages/laravel-bluesky/crypto"},{"title":"Core — AT Protocol 코어 조작","href":"/ko/packages/laravel-bluesky/core"}]},{"title":"Laravel Nostr","href":"/ko/packages/laravel-nostr"},{"title":"Laravel Notification for Discord(Webhook)","href":"/ko/packages/laravel-notification-discord-webhook"},{"title":"Socialite for Discord","href":"/ko/packages/socialite-discord"},{"group":"LINE SDK for Laravel","expanded":false,"pages":[{"title":"LINE SDK for Laravel","sidebarTitle":"개요","href":"/ko/packages/laravel-line-sdk/index"},{"title":"Webhook / Bot - LINE SDK for Laravel","sidebarTitle":"Webhook / Bot","href":"/ko/packages/laravel-line-sdk/bot"},{"title":"알림 채널 - LINE SDK for Laravel","sidebarTitle":"알림 채널","href":"/ko/packages/laravel-line-sdk/notification"},{"title":"Socialite (LINE Login) - LINE SDK for Laravel","sidebarTitle":"Socialite (LINE Login)","href":"/ko/packages/laravel-line-sdk/socialite"}]},{"group":"Google Sheets API for Laravel","expanded":false,"pages":[{"title":"Google Sheets API for Laravel","sidebarTitle":"Google Sheets","href":"/ko/packages/laravel-google-sheets/index"},{"title":"Service account 인증 - Google Sheets API for Laravel","sidebarTitle":"Service account","href":"/ko/packages/laravel-google-sheets/service-account"},{"title":"OAuth 2.0 인증 - Google Sheets API for Laravel","sidebarTitle":"OAuth 2.0","href":"/ko/packages/laravel-google-sheets/oauth"}]}]},{"group":"AI SDK","pages":[{"title":"Laravel AI SDK용 Amazon Bedrock 드라이버","href":"/ko/packages/laravel-amazon-bedrock"}]},{"group":"VOICEVOX","pages":[{"group":"VOICEVOX Core for PHP","expanded":false,"pages":[{"title":"VOICEVOX Core for PHP","sidebarTitle":"개요","href":"/ko/packages/voicevox-core-php/index"},{"title":"사용법 - VOICEVOX Core for PHP","sidebarTitle":"사용법","href":"/ko/packages/voicevox-core-php/usage"},{"title":"API 레퍼런스 - VOICEVOX Core for PHP","sidebarTitle":"API 레퍼런스","href":"/ko/packages/voicevox-core-php/api"}]},{"group":"VOICEVOX for Laravel","expanded":false,"pages":[{"title":"VOICEVOX for Laravel","sidebarTitle":"개요","href":"/ko/packages/laravel-voicevox/index"},{"title":"설치와 설정 - VOICEVOX for Laravel","sidebarTitle":"설치","href":"/ko/packages/laravel-voicevox/installation"},{"title":"시작하기 - VOICEVOX for Laravel","sidebarTitle":"시작하기","href":"/ko/packages/laravel-voicevox/getting-started"},{"title":"설정 레퍼런스 - VOICEVOX for Laravel","sidebarTitle":"설정","href":"/ko/packages/laravel-voicevox/configuration"},{"title":"클라이언트 모드: 토크 (텍스트 음성 합성) - VOICEVOX for Laravel","sidebarTitle":"클라이언트: 토크","href":"/ko/packages/laravel-voicevox/client-talk"},{"title":"클라이언트 모드: 송 (노래 음성 합성) - VOICEVOX for Laravel","sidebarTitle":"클라이언트: 송","href":"/ko/packages/laravel-voicevox/client-song"},{"title":"클라이언트 모드 - 사용자 사전 - VOICEVOX for Laravel","sidebarTitle":"클라이언트 모드 - 사용자 사전","href":"/ko/packages/laravel-voicevox/client-user-dict"},{"title":"클라이언트 모드 - 프리셋 - VOICEVOX for Laravel","sidebarTitle":"클라이언트 모드 - 프리셋","href":"/ko/packages/laravel-voicevox/client-presets"},{"title":"네이티브 모드: 토크 (텍스트 음성 합성) - VOICEVOX for Laravel","sidebarTitle":"네이티브: 토크","href":"/ko/packages/laravel-voicevox/native-talk"},{"title":"네이티브 모드: 송 (노래 음성 합성) - VOICEVOX for Laravel","sidebarTitle":"네이티브: 송","href":"/ko/packages/laravel-voicevox/native-song"},{"title":"네이티브 모드 - 사용자 사전 - VOICEVOX for Laravel","sidebarTitle":"네이티브 모드 - 사용자 사전","href":"/ko/packages/laravel-voicevox/native-user-dict"},{"title":"네이티브 모드 - 프리셋 - VOICEVOX for Laravel","sidebarTitle":"네이티브 모드 - 프리셋","href":"/ko/packages/laravel-voicevox/native-presets"},{"title":"엔진 API 모드: 토크 (텍스트 음성 합성) - VOICEVOX for Laravel","sidebarTitle":"엔진 API: 토크","href":"/ko/packages/laravel-voicevox/engine-talk"},{"title":"엔진 API 모드: 송 (노래 음성 합성) - VOICEVOX for Laravel","sidebarTitle":"엔진 API: 송","href":"/ko/packages/laravel-voicevox/engine-song"},{"title":"Score와 Note 상세 해설 - VOICEVOX for Laravel","sidebarTitle":"Score와 Note","href":"/ko/packages/laravel-voicevox/song-score-note"},{"title":"VoicevoxResponse - VOICEVOX for Laravel","sidebarTitle":"VoicevoxResponse","href":"/ko/packages/laravel-voicevox/response"},{"title":".vvproj 파일 사양 - VOICEVOX for Laravel","sidebarTitle":".vvproj","href":"/ko/packages/laravel-voicevox/vvproj"},{"title":"엔진 API 연동 앱 개발 가이드 - VOICEVOX for Laravel","sidebarTitle":"앱 개발 가이드","href":"/ko/packages/laravel-voicevox/app-guide"},{"title":"Laravel AI SDK 연동 - VOICEVOX for Laravel","sidebarTitle":"AI SDK 연동","href":"/ko/packages/laravel-voicevox/ai-sdk"}]},{"group":"VOICEVOX 엔진 API 레퍼런스","pages":[{"group":"Query Creation","pages":[{"title":"Create query for speech synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /audio_query","href":"/en/packages/laravel-voicevox/engine-api/query-creation/create-query-for-speech-synthesis"},{"title":"Create query for speech synthesis using preset","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /audio_query_from_preset","href":"/en/packages/laravel-voicevox/engine-api/query-creation/create-query-for-speech-synthesis-using-preset"},{"title":"Create query for singing voice synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /sing_frame_audio_query","href":"/en/packages/laravel-voicevox/engine-api/query-creation/create-query-for-singing-voice-synthesis"}]},{"group":"Query Editing","pages":[{"title":"Get accent phrases from text","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /accent_phrases","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-accent-phrases-from-text"},{"title":"Get phoneme lengths and pitch from accent phrases","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /mora_data","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-phoneme-lengths-and-pitch-from-accent-phrases"},{"title":"Get phoneme lengths from accent phrases","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /mora_length","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-phoneme-lengths-from-accent-phrases"},{"title":"Get pitch from accent phrases","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /mora_pitch","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-pitch-from-accent-phrases"},{"title":"Get frame-by-frame fundamental frequency from a score / singing voice synthesis query","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /sing_frame_f0","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-frame-by-frame-fundamental-frequency-from-a-score-singing-voice-synthesis-query"},{"title":"Get frame-by-frame volume from a score / singing voice synthesis query","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /sing_frame_volume","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-frame-by-frame-volume-from-a-score-singing-voice-synthesis-query"}]},{"group":"Speech Synthesis","pages":[{"title":"Perform speech synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/perform-speech-synthesis"},{"title":"Perform streaming speech synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /streaming_synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/perform-streaming-speech-synthesis"},{"title":"Perform speech synthesis (cancellable)","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /cancellable_synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/perform-speech-synthesis-cancellable"},{"title":"Synthesize multiple speeches at once","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /multi_synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/synthesize-multiple-speeches-at-once"},{"title":"Frame Synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /frame_synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/frame-synthesis"},{"title":"Check if morphing is possible for specified style","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /morphable_targets","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/check-if-morphing-is-possible-for-specified-style"},{"title":"Synthesize speech morphed with two styles","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /synthesis_morphing","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/synthesize-speech-morphed-with-two-styles"}]},{"group":"OpenAI Compatible","pages":[{"title":"Create speech with an OpenAI-compatible API","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /v1/audio/speech","href":"/en/packages/laravel-voicevox/engine-api/openai-compatible/create-speech-with-an-openai-compatible-api"}]},{"group":"Other","pages":[{"title":"Combine multiple base64-encoded wav data into one","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /connect_waves","href":"/en/packages/laravel-voicevox/engine-api/other/combine-multiple-base64-encoded-wav-data-into-one"},{"title":"Validate AquesTalk-style notation","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /validate_kana","href":"/en/packages/laravel-voicevox/engine-api/other/validate-aquestalk-style-notation"},{"title":"Initialize Speaker","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /initialize_speaker","href":"/en/packages/laravel-voicevox/engine-api/other/initialize-speaker"},{"title":"Is Initialized Speaker","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /is_initialized_speaker","href":"/en/packages/laravel-voicevox/engine-api/other/is-initialized-speaker"},{"title":"Supported Devices","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /supported_devices","href":"/en/packages/laravel-voicevox/engine-api/other/supported-devices"},{"title":"Get Presets","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /presets","href":"/en/packages/laravel-voicevox/engine-api/other/get-presets"},{"title":"Add Preset","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /add_preset","href":"/en/packages/laravel-voicevox/engine-api/other/add-preset"},{"title":"Update Preset","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /update_preset","href":"/en/packages/laravel-voicevox/engine-api/other/update-preset"},{"title":"Delete Preset","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /delete_preset","href":"/en/packages/laravel-voicevox/engine-api/other/delete-preset"},{"title":"Speakers","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /speakers","href":"/en/packages/laravel-voicevox/engine-api/other/speakers"},{"title":"Speaker Info","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /speaker_info","href":"/en/packages/laravel-voicevox/engine-api/other/speaker-info"},{"title":"Singers","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /singers","href":"/en/packages/laravel-voicevox/engine-api/other/singers"},{"title":"Singer Info","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /singer_info","href":"/en/packages/laravel-voicevox/engine-api/other/singer-info"},{"title":"Version","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /version","href":"/en/packages/laravel-voicevox/engine-api/other/version"},{"title":"Core Versions","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /core_versions","href":"/en/packages/laravel-voicevox/engine-api/other/core-versions"},{"title":"Engine Manifest","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /engine_manifest","href":"/en/packages/laravel-voicevox/engine-api/other/engine-manifest"},{"title":"Get Portal Page","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /","href":"/en/packages/laravel-voicevox/engine-api/other/get-portal-page"}]},{"group":"Voice Library Management","pages":[{"title":"Downloadable Libraries","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /downloadable_libraries","href":"/en/packages/laravel-voicevox/engine-api/voice-library-management/downloadable-libraries"},{"title":"Installed Libraries","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /installed_libraries","href":"/en/packages/laravel-voicevox/engine-api/voice-library-management/installed-libraries"},{"title":"Install Library","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /install_library/{library_uuid}","href":"/en/packages/laravel-voicevox/engine-api/voice-library-management/install-library"},{"title":"Uninstall Library","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /uninstall_library/{library_uuid}","href":"/en/packages/laravel-voicevox/engine-api/voice-library-management/uninstall-library"}]},{"group":"User Dictionary","pages":[{"title":"Get User Dict Words","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /user_dict","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/get-user-dict-words"},{"title":"Add User Dict Word","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /user_dict_word","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/add-user-dict-word"},{"title":"Rewrite User Dict Word","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json put /user_dict_word/{word_uuid}","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/rewrite-user-dict-word"},{"title":"Delete User Dict Word","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json delete /user_dict_word/{word_uuid}","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/delete-user-dict-word"},{"title":"Import User Dict Words","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /import_user_dict","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/import-user-dict-words"}]},{"group":"Settings","pages":[{"title":"Setting Get","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /setting","href":"/en/packages/laravel-voicevox/engine-api/settings/setting-get"},{"title":"Setting Post","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /setting","href":"/en/packages/laravel-voicevox/engine-api/settings/setting-post"}]}]}]},{"group":"스타터 킷","pages":[{"group":"Laravel Console Starter","pages":[{"title":"Laravel Console Starter","href":"/ko/packages/laravel-console-starter/index"},{"title":"튜토리얼 - Laravel Console Starter","sidebarTitle":"튜토리얼","href":"/ko/packages/laravel-console-starter/tutorial"}]}]},{"group":"피드·RSS","pages":[{"title":"Laravel FullFeed","href":"/ko/packages/laravel-fullfeed"},{"group":"Feedable","expanded":false,"pages":[{"title":"Feedable","href":"/ko/packages/feedable/index"},{"title":"코어 패키지와 커스텀 드라이버 - Feedable","sidebarTitle":"코어와 커스텀 드라이버","href":"/ko/packages/feedable/core"},{"title":"지원 사이트 목록 - Feedable","sidebarTitle":"지원 사이트","href":"/ko/packages/feedable/drivers"}]}]},{"group":"미들웨어","pages":[{"title":"Laravel Fetch Metadata","href":"/ko/packages/laravel-fetch-metadata"}]}]},{"tab":"튜토리얼","pages":[{"title":"튜토리얼","href":"/ko/introduction"}]},{"tab":"가이드","pages":[{"title":"가이드","href":"/ko/lifecycle"}]},{"tab":"심화 주제","pages":[{"title":"심화 주제","href":"/ko/advanced/mcp-server"}]},{"tab":"블로그","pages":[{"title":"블로그","href":"/ko/blog/changelog/202610"}]}]},{"language":"nl","pages":[{"title":"nl","href":"/nl/packages/laravel-bluesky/authentication"}]},{"language":"zh-Hans","pages":[{"title":"zh-Hans","href":"/zh-CN/packages/laravel-bluesky/authentication"}]},{"language":"zh-Hant","pages":[{"title":"zh-Hant","href":"/zh-TW/packages/laravel-bluesky/authentication"}]}]},"basePath":"","title":"인증 방식 비교 - Laravel Bluesky - Knowledge of Laravel","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":["2bfc744e19"],"chunks":["NarrationPlayer-CfOFO133.js","types-CiTgMxws.js","shallow-dY3TMRCk.js"]}