# Discourse 학습 관리 시스템 통합 (LTI 1.3 인증)

**URL:** https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174
**Category:** Plugin
**Tags:** official, lti, included-in-core
**Created:** [7월 6, 2021, 12:37오후 UTC](https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174 "2021-07-06T12:37:14Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [7월 6, 2021, 12:37오후 UTC](https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174/1 "2021-07-06T12:37:14Z")

</div>

| | | |
| --- | --- | --- |
| :discourse2: | **요약** | **Discourse LTI** 플러그인은 [LTI 1.3 표준](https://www.imsglobal.org/activity/learning-tools-interoperability)을 통해 Discourse가 다양한 학습 관리 시스템(LMS)과 통합할 수 있게 해줍니다. |
| 📖 | **설치 가이드** | **이 플러그인은 Discourse 코어에 번들로 포함됩니다**. 별도로 설치할 필요가 없습니다. |

> [@](#):
>
> :discourse2: 이 플러그인은 Discourse 팀이 유지 관리하는 #official(공식) 플러그인입니다. #Support(지원), #Contribute > Bug(버그), #Contribute > UX(UX), #Contribute > Feature(기능 요청) 관련 사항은 메타(Meta)의 해당 카테고리에서 적절한 플러그인 태그를 붙여 요청할 수 있습니다. 아래 링크를 클릭하여 시작하세요. 👍
> 
> [❓&nbsp; **지원**](https://meta.discourse.org/new-topic?category_id=6&body=%3E%20Before%20asking,%20did%20you%20search%20first%3F%20Press%20%F0%9F%94%8D%20at%20the%20upper%20right%20to%20search.&tags=lti "Discourse LTI 설정 및 사용에 대한 지원 요청") [🐛&nbsp; **버그**](https://meta.discourse.org/new-topic?category_id=1&tags=lti "버그 리포트는 플러그인의 정상/일반적인 사용을 방해하는 문제가 있음을 의미합니다") [👀&nbsp; **UX**](https://meta.discourse.org/new-topic?category_id=9&tags=lti "Discourse LTI의 사용자 인터페이스 및 기능 제시 방식(언어 및 UI 요소 포함)에 대한 토론") [💡&nbsp; **기능**](https://meta.discourse.org/new-topic?category_id=2&tags=lti "기존 Discourse LTI 기능의 개선 또는 강화 방법 및 제안된 새 기능이 어떻게 작동할 수 있는지에 대한 토론")

이 플러그인은 여러 학습 관리 시스템에서 지원하는 LTI 1.3 인증 표준을 구현합니다. Discourse는 LTI 표준 내에서 “Tool(도구)” 역할을 수행합니다. 설정이 완료되면, 사용자는 학습 관리 시스템에서 버튼/링크를 클릭하여 즉시 Discourse에 로그인할 수 있습니다.

정확한 설정 방법은 사용 중인 학습 관리 시스템에 따라 달라집니다. 하지만 일반적으로 다음과 같습니다:

1. 학습 관리 시스템에서 새로운 “Tool(도구)” 항목을 생성합니다.

- LTI 버전: 1.3
- Launch URL: 사이트의 아무 URL이나 지정 가능합니다. 사용자는 로그인 후 여기로 이동합니다.
- Auth Request URL: `https://<your-discourse-site>/auth/lti/initiate`
- Redirect URL: `https://<your-discourse-site>/auth/lti/callback`
- Tool Public Key: 비워 둡니다. Discourse는 LMS로 데이터를 전송하지 않습니다.

1. LMS에서 ‘Authorization endpoint(인가 엔드포인트)’, “Tool Client ID(도구 클라이언트 ID)”, “Platform Issuer ID(플랫폼 발급자 ID)” 및 "Platform Public Key(플랫폼 공개 키)"를 찾아 Discourse의 관련 사이트 설정에 추가합니다. Discourse에서 설정은 사이트 설정 UI에서 `lti`를 검색하여 찾을 수 있습니다.

2. 학습 관리 시스템이 사용자 이메일이 검증되었음을 보장하는 경우, `lti email verified` 사이트 설정을 활성화하세요. ⚠ 경고: LMS가 이메일을 검증하지 않는 경우, `lti email verified`를 활성화하는 것은 보안 위험을 초래할 수 있습니다.

3. `lti enabled` 사이트 설정을 켜세요.

이 설명이 사용 중인 LMS에 적용되지 않는다면, 아래 주제에 게시해 주시면 최선을 다해 설명을 업데이트하겠습니다.

### 사이트가 invite\_required인 경우 어떻게 하나요?

사용자가 처음 로그인할 때 Discourse 초대 수락 플로우를 거치도록 하려면, LTI "Custom Properties(사용자 정의 속성)"를 사용하여 Discourse 초대 링크를 지정할 수 있습니다. 신규 사용자는 초대 링크로, 기존 사용자는 일반 Launch URL로 이동합니다. 예를 들어:

| 속성 이름 | 속성 값 |
| --- | --- |
| `discourse_invite_link` | `https://discourse.example.com/invites/abcdefg` |

### FAQ

**이 플러그인은 동시에 여러 LMS 시스템과의 통합을 지원하나요?**

- 현재 이 플러그인은 한 사이트당 하나의 LMS만 연결할 수 있도록 지원합니다. `LTI client IDs` 사이트 설정은 여러 값을 허용하지만, 이는 일부 LMS 시스템이 \*\*코스(강의)\*\*별로 **클라이언트 ID** 를 하나씩 설정하기 때문입니다.

---

<div class="post-metadata">

### Author: ![robertguss](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/robertguss/32/479605_2.png) [@robertguss](https://meta.discourse.org/u/robertguss)
#### Post date: [1월 31, 2025, 6:33오후 UTC](https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174/15 "2025-01-31T18:33:30Z")

</div>

[Canvas LMS](https://www.instructure.com/canvas)와의 LTI 연동을 위한 구체적인 지침이 있으신가요?

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2월 2, 2025, 3:29오후 UTC](https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174/16 "2025-02-02T15:29:31Z")

</div>

통합 작업은 관리자가 직접 수행해야 합니다.

---

<div class="post-metadata">

### Author: ![robertguss](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/robertguss/32/479605_2.png) [@robertguss](https://meta.discourse.org/u/robertguss)
#### Post date: [2월 3, 2025, 2:00오후 UTC](https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174/17 "2025-02-03T14:00:16Z")

</div>

저는 관리자 중 한 명이자 소프트웨어 엔지니어입니다. 제가 겪고 있는 문제는 쿠키와 Discourse와 Canvas 사이의 "state"가 일치하지 않는 것과 관련이 있다고 생각합니다.

Discourse 로그에서 확인되는 오류는 다음과 같습니다.

(lti) Authentication failure! state\_mismatch: StandardError, State parameter did not match the session

이 오류가 여기에서 발생한다고 생각합니다: [discourse-lti/lib/discourse\_lti/lti\_omniauth\_strategy.rb at main · discourse/discourse-lti · GitHub](https://github.com/discourse/discourse-lti/blob/main/lib/discourse_lti/lti_omniauth_strategy.rb#L152-L153)

이 문제를 디버깅하는 데 도움이 될 아이디어나 확인해 볼 사항이 있을까요? Canvas 문서의 이 페이지: [Overview of an LTI Launch \<a name="launch-overview"\>\</a\> - Canvas LMS REST API Documentation](https://canvas.instructure.com/doc/api/file.lti_launch_overview.html)

여기에는 “쿠키 없이 시작(Launching without Cookies)” 섹션이 있는데, 이것이 이 문제와 관련이 있다고 생각합니다. 하지만 100% 확신은 하지 않습니다. 도움이 되거나 통찰을 주실 수 있다면 매우 감사하겠습니다.

---

<div class="post-metadata">

### Author: ![kevincolten](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kevincolten/32/120986_2.png) [@kevincolten](https://meta.discourse.org/u/kevincolten)
#### Post date: [3월 14, 2025, 7:28오후 UTC](https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174/18 "2025-03-14T19:28:36Z")

</div>

Canvas에서 LTI를 작동시킬 수 있었는데, 한 가지 주의할 점이 있습니다. 제 단계는 다음과 같습니다:

1. Canvas에서 개발자 키(Developer Key)를 생성합니다. JWK Method와 Public JWK 필드에 무엇을 입력하든 상관없습니다.  

2. Discourse LTI 설정에서 설정값을 입력합니다.  

3. 공개 키의 경우, https://\<your\_canvas\_url\>/api/lti/security/jwks 로 이동하여 **두 번째 키를 복사** 합니다. 그런 다음 [JWK to PEM Converter Online – Free | 8gwifi.org](https://8gwifi.org/jwkconvertfunctions.jsp) 로 가서 해당 키를 붙여넣고 변환합니다. 마지막으로 `-----BEGIN/END PUBLIC KEY-----` 사이에 있는 **텍스트를 복사** 하여 Discourse LTI 설정의 _Lti platform public key_ 항목에 붙여넣고 저장합니다.

주의할 점은 다음과 같습니다. Canvas가 생성하는 JWK는 월별로 순환되는 것 같습니다. 두 번째 키가 변경되면 LTI가 작동하지 않게 되며, 3단계를 따라 새 키로 교체해야 합니다.

Discourse LTI 플러그인은 최신 상태를 유지하려면 Public JWK URL을 지원해야 합니다.

---

<div class="post-metadata">

### Author: ![HandSpy\_v3](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/handspy_v3/32/489737_2.png) [@HandSpy\_v3](https://meta.discourse.org/u/HandSpy_v3)
#### Post date: [6월 4, 2025, 1:06오후 UTC](https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174/19 "2025-06-04T13:06:53Z")

</div>

하나의 Discourse에 여러 LMS를 통합할 수 있나요?

---

<div class="post-metadata">

### Author: ![tobiaseigen](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tobiaseigen/32/539204_2.png) [@tobiaseigen](https://meta.discourse.org/u/tobiaseigen)
#### Post date: [7월 16, 2025, 9:17오후 UTC](https://meta.discourse.org/t/discourse-learning-management-system-integration-lti-1-3-authentication/196174/20 "2025-07-16T21:17:53Z")

</div>

🥳 이 플러그인은 이제 [Bundling more popular plugins with Discourse core](https://meta.discourse.org/t/bundling-more-popular-plugins-with-discourse-core/373574?u=tobiaseigen%EC%97%90%EC%84%9C) 설명하듯 Discourse 코어에 번들링되었습니다. 자체 호스팅을 사용 중이고 해당 플러그인을 사용 중이라면, 다음 업그레이드 전에 `app.yml`에서 이를 제거해야 합니다.
