@jjlmoya/utils-developer 1.16.0 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +2 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/jwtDecoder/bibliography.astro +14 -0
  8. package/src/tool/jwtDecoder/bibliography.ts +12 -0
  9. package/src/tool/jwtDecoder/component.astro +209 -0
  10. package/src/tool/jwtDecoder/entry.ts +30 -0
  11. package/src/tool/jwtDecoder/i18n/de.ts +248 -0
  12. package/src/tool/jwtDecoder/i18n/en.ts +247 -0
  13. package/src/tool/jwtDecoder/i18n/es.ts +248 -0
  14. package/src/tool/jwtDecoder/i18n/fr.ts +248 -0
  15. package/src/tool/jwtDecoder/i18n/id.ts +248 -0
  16. package/src/tool/jwtDecoder/i18n/it.ts +248 -0
  17. package/src/tool/jwtDecoder/i18n/ja.ts +248 -0
  18. package/src/tool/jwtDecoder/i18n/ko.ts +248 -0
  19. package/src/tool/jwtDecoder/i18n/nl.ts +247 -0
  20. package/src/tool/jwtDecoder/i18n/pl.ts +247 -0
  21. package/src/tool/jwtDecoder/i18n/pt.ts +247 -0
  22. package/src/tool/jwtDecoder/i18n/ru.ts +248 -0
  23. package/src/tool/jwtDecoder/i18n/sv.ts +248 -0
  24. package/src/tool/jwtDecoder/i18n/tr.ts +248 -0
  25. package/src/tool/jwtDecoder/i18n/zh.ts +248 -0
  26. package/src/tool/jwtDecoder/index.ts +11 -0
  27. package/src/tool/jwtDecoder/jwt-decoder-parser-and-claims-inspector.css +358 -0
  28. package/src/tool/jwtDecoder/logic.ts +96 -0
  29. package/src/tool/jwtDecoder/seo.astro +15 -0
  30. package/src/tool/jwtDecoder/ui.ts +38 -0
  31. package/src/tool/serpPixelSimulator/bibliography.astro +11 -4
  32. package/src/tool/serpPixelSimulator/index.ts +0 -4
  33. package/src/tool/serpPixelSimulator/seo.astro +8 -5
  34. package/src/tools.ts +2 -1
@@ -0,0 +1,248 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { JwtDecoderUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'jwt-decoder-parser-and-claims-inspector';
7
+ const title = 'JWT Decoder, Parser and Claims Inspector';
8
+ const description = 'JSON Web Token을 붙여넣고 헤더와 페이로드를 즉시 디코딩하며 등록된 클레임을 검사하고 만료된 토큰을 발견하며 인증 흐름을 디버깅하기 위해 깨끗한 JSON을 복사하세요.';
9
+
10
+ const howTo = [
11
+ {
12
+ name: 'JWT 붙여넣기',
13
+ text: 'Authorization 헤더, 쿠키, 로그 항목 또는 ID 공급자에서 토큰을 복사하여 입력 필드에 붙여넣으세요.',
14
+ },
15
+ {
16
+ name: '디코딩된 헤더와 페이로드 읽기',
17
+ text: '이 도구는 토큰을 헤더, 페이로드, 서명으로 분할한 다음 JSON 세그먼트를 별도의 패널에 표시하여 빠르게 검사합니다.',
18
+ },
19
+ {
20
+ name: '중요한 클레임 확인하기',
21
+ text: '알고리즘, 발급자, 수신자, 주체, 발급 시간, 유효 시작 시간, 만료 시간을 Unix 타임스탬프를 수동으로 변환하지 않고 검토하세요.',
22
+ },
23
+ {
24
+ name: '필요한 데이터 복사하기',
25
+ text: '팀과 정리된 디버깅 스냅샷을 공유해야 할 때 디코딩된 한 섹션이나 전체 디코딩 출력을 복사하세요.',
26
+ },
27
+ ];
28
+
29
+ const faq = [
30
+ {
31
+ question: 'JWT를 디코딩하면 토큰이 유효하다는 것이 증명되나요?',
32
+ answer: '아니요. 디코딩은 base64url로 인코딩된 헤더와 페이로드만 보여줍니다. 토큰은 서명, 발급자, 수신자, 만료 및 관련 클레임이 애플리케이션이나 ID 공급자에 의해 검증된 후에만 신뢰할 수 있습니다.',
33
+ },
34
+ {
35
+ question: '이 JWT 디코더를 액세스 토큰과 ID 토큰에 사용할 수 있나요?',
36
+ answer: '네. 이 디코더는 표준 3부분 JWT 형식을 사용하는 한 OAuth 액세스 토큰, OpenID Connect ID 토큰, 세션 토큰 및 서비스 간 토큰을 검사하는 데 유용합니다.',
37
+ },
38
+ {
39
+ question: '서명 패널이 토큰을 검증하지 않는 이유는 무엇인가요?',
40
+ answer: 'JWT 검증에는 올바른 시크릿, 공개 키 또는 JWKS 구성이 필요합니다. 이 도구는 눈에 보이는 서명 문자열이 유효성 증명인 것처럼 가장하지 않고 개발자가 토큰 내용을 볼 수 있도록 의도적으로 디코딩과 검사에 중점을 둡니다.',
41
+ },
42
+ {
43
+ question: 'JWT를 디버깅할 때 가장 먼저 무엇을 확인해야 하나요?',
44
+ answer: 'exp, nbf, iss, aud, alg부터 시작하세요. 대부분의 실제 운영 문제는 만료된 토큰, 클록 스큐, 잘못된 수신자 값, 예상치 못한 발급자 URL 또는 안전하지 않은 알고리즘 가정에서 비롯됩니다.',
45
+ },
46
+ ];
47
+
48
+ const ui: JwtDecoderUI = {
49
+ tokenLabel: 'JWT 토큰',
50
+ tokenPlaceholder: '여기에 JWT 붙여넣기: header.payload.signature',
51
+ sampleButton: '샘플 로드',
52
+ clearButton: '지우기',
53
+ statusWaiting: 'JSON 헤더, 페이로드 및 클레임을 디코딩하려면 토큰을 붙여넣으세요.',
54
+ statusValid: 'JWT가 성공적으로 디코딩되었습니다.',
55
+ statusInvalid: '이것은 유효한 3부분 JWT로 보이지 않습니다.',
56
+ statusExpired: 'JWT가 디코딩되었지만 exp 클레임이 이미 만료되었습니다.',
57
+ statusUnsigned: 'JWT가 디코딩되었지만 서명되지 않았거나 alg none을 사용합니다.',
58
+ headerTitle: '헤더',
59
+ payloadTitle: '페이로드',
60
+ signatureTitle: '서명',
61
+ claimsTitle: '등록된 클레임',
62
+ copyHeader: '디코딩된 헤더 복사',
63
+ copyPayload: '디코딩된 페이로드 복사',
64
+ copySignature: '서명 복사',
65
+ copyAll: '모두 복사',
66
+ copiedLabel: '복사됨',
67
+ invalidTokenTitle: '유효하지 않은 JWT',
68
+ invalidTokenBody: '토큰에 점으로 구분된 3개의 base64url 세그먼트가 있는지 확인하세요.',
69
+ invalidSegmentError: '토큰에 점으로 구분된 3개의 base64url 세그먼트가 있는지 확인하세요.',
70
+ invalidDecodeError: '헤더 또는 페이로드를 유효한 JSON으로 디코딩할 수 없습니다.',
71
+ emptyJson: '{}',
72
+ signaturePresent: '서명 세그먼트가 있습니다. 인증 레이어에서 올바른 키로 검증하세요.',
73
+ signatureMissing: '서명 세그먼트 없음',
74
+ algorithmLabel: '알고리즘',
75
+ typeLabel: '유형',
76
+ issuerLabel: '발급자',
77
+ subjectLabel: '주체',
78
+ audienceLabel: '수신자',
79
+ issuedAtLabel: '발급 시간',
80
+ notBeforeLabel: '유효 시작',
81
+ expiresAtLabel: '만료 시간',
82
+ claimMissing: '없음',
83
+ privacyNote: '디코딩은 브라우저 세션에서 실행됩니다. 보안 정책에서 허용하지 않는 한 운영 시크릿을 어떤 도구에도 붙여넣지 마세요.',
84
+ sampleToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnYW1lYm9iLXVzZXItNDIiLCJuYW1lIjoiR2FtZUJvYiBEZXZlbG9wZXIiLCJpc3MiOiJodHRwczovL3d3dy5nYW1lYm9iLmRldiIsImF1ZCI6ImRldmVsb3Blci10b29scyIsImlhdCI6MTcxNzIwMDAwMCwibmJmIjoxNzE3MjAwMDAwLCJleHAiOjE4OTM0NTYwMDAsInJvbGUiOiJhZG1pbiJ9.demo-signature',
85
+ };
86
+
87
+ const faqSchema: WithContext<FAQPage> = {
88
+ '@context': 'https://schema.org',
89
+ '@type': 'FAQPage',
90
+ mainEntity: faq.map((item) => ({
91
+ '@type': 'Question',
92
+ name: item.question,
93
+ acceptedAnswer: {
94
+ '@type': 'Answer',
95
+ text: item.answer,
96
+ },
97
+ })),
98
+ };
99
+
100
+ const howToSchema: WithContext<HowTo> = {
101
+ '@context': 'https://schema.org',
102
+ '@type': 'HowTo',
103
+ name: title,
104
+ description,
105
+ step: howTo.map((step, index) => ({
106
+ '@type': 'HowToStep',
107
+ position: index + 1,
108
+ name: step.name,
109
+ text: step.text,
110
+ })),
111
+ };
112
+
113
+ const appSchema: WithContext<SoftwareApplication> = {
114
+ '@context': 'https://schema.org',
115
+ '@type': 'SoftwareApplication',
116
+ name: title,
117
+ description,
118
+ applicationCategory: 'DeveloperApplication',
119
+ operatingSystem: 'Any',
120
+ offers: {
121
+ '@type': 'Offer',
122
+ price: '0',
123
+ priceCurrency: 'EUR',
124
+ },
125
+ inLanguage: 'ko',
126
+ };
127
+
128
+ export const content: ToolLocaleContent<JwtDecoderUI> = {
129
+ slug,
130
+ title,
131
+ description,
132
+ ui,
133
+ faqTitle: 'JWT 디코더 FAQ',
134
+ faq,
135
+ bibliographyTitle: 'JWT 명세 및 보안 참조',
136
+ bibliography,
137
+ howTo,
138
+ schemas: [appSchema, faqSchema, howToSchema],
139
+ seo: [
140
+ {
141
+ type: 'title',
142
+ text: '보안 컨텍스트를 잃지 않고 JWT 디코딩하기',
143
+ level: 2,
144
+ },
145
+ {
146
+ type: 'paragraph',
147
+ html: 'JSON Web Token은 간결해 보이지만, 서명 알고리즘, 발급자, 수신자, 주체, 발급 시간, 유효 시작 시간, 만료 시간 및 애플리케이션별 인증 클레임 등 인증 실패를 설명하는 정확한 세부 정보를 담고 있는 경우가 많습니다. 이 <strong>JWT 디코더, 파서 및 클레임 인스펙터</strong>는 세 개의 토큰 세그먼트를 읽을 수 있는 JSON으로 변환하여 인증 흐름을 더 빠르게 디버깅할 수 있게 해줍니다.',
148
+ },
149
+ {
150
+ type: 'diagnostic',
151
+ variant: 'warning',
152
+ title: '디코딩이 신뢰를 의미하지는 않습니다',
153
+ html: '누구나 JWT를 base64url로 디코딩할 수 있습니다. 신뢰는 애플리케이션이 올바른 시크릿, 공개 키 또는 JWKS로 서명을 검증한 다음 발급자, 수신자, 만료 및 도메인별 클레임을 검증한 후에만 시작됩니다. 이 도구는 데이터 검사용으로 사용하고 토큰을 진짜로 받아들이는 데 사용하지 마세요.',
154
+ },
155
+ {
156
+ type: 'title',
157
+ text: '각 JWT 세그먼트가 알려주는 것',
158
+ level: 3,
159
+ },
160
+ {
161
+ type: 'table',
162
+ headers: ['세그먼트', '일반적인 내용', '디버깅 가치'],
163
+ rows: [
164
+ ['헤더', '알고리즘, 토큰 유형 및 선택적 키 ID', 'HS256, RS256, ES256 또는 다른 검증 전략을 토큰이 기대하는지 보여줍니다.'],
165
+ ['페이로드', '등록된 클레임 및 애플리케이션 클레임', '신원, 테넌트, 스코프, 역할, 만료 및 수신자 불일치를 드러냅니다.'],
166
+ ['서명', 'base64url로 인코딩된 암호화 서명 바이트', '서명 세그먼트가 존재함을 확인하지만 다른 곳에서 올바른 키로 검증해야 합니다.'],
167
+ ],
168
+ },
169
+ {
170
+ type: 'title',
171
+ text: '보통 인증 실패를 설명하는 클레임',
172
+ level: 3,
173
+ },
174
+ {
175
+ type: 'list',
176
+ items: [
177
+ '<strong>exp:</strong> 토큰이 만료된 경우 갱신 로직이나 클록 설정이 잘못되었을 수 있습니다.',
178
+ '<strong>nbf:</strong> 토큰이 아직 활성화되지 않은 경우 서버와 ID 공급자의 클록이 동기화되지 않았을 수 있습니다.',
179
+ '<strong>iss:</strong> 발급자 URL이 구성과 다른 경우 토큰이 잘못된 테넌트나 환경에서 온 것일 수 있습니다.',
180
+ '<strong>aud:</strong> 수신자가 API 식별자와 일치하지 않는 경우 토큰이 다른 리소스용으로 발급된 것입니다.',
181
+ '<strong>alg:</strong> 알고리즘이 예상치 못한 경우 검증기가 토큰을 거부하거나 위험한 구성 실수를 드러낼 수 있습니다.',
182
+ ],
183
+ },
184
+ {
185
+ type: 'title',
186
+ text: '개발 중 JWT 파서의 사용 사례',
187
+ level: 3,
188
+ },
189
+ {
190
+ type: 'comparative',
191
+ columns: 3,
192
+ items: [
193
+ {
194
+ title: '프론트엔드 디버깅',
195
+ description: '로그인 후 수신된 ID 토큰과 액세스 토큰을 검사하여 스코프, 역할 및 프로필 클레임을 확인하세요.',
196
+ icon: 'mdi:monitor-dashboard',
197
+ points: ['프로필 클레임 확인', '스코프와 역할 확인', '로그인 환경 비교'],
198
+ },
199
+ {
200
+ title: '백엔드 API QA',
201
+ description: '예상되는 발급자 및 수신자 값과 Authorization 헤더에 실제로 전송된 토큰을 비교하세요.',
202
+ icon: 'mdi:api',
203
+ highlight: true,
204
+ points: ['수신자 형태 검증', '발급자 불일치 발견', '베어러 토큰 검사'],
205
+ },
206
+ {
207
+ title: 'ID 공급자 설정',
208
+ description: 'Auth0, Azure AD, Cognito, Keycloak 또는 커스텀 공급자의 클레임이 앱이 기대하는 형태인지 확인하세요.',
209
+ icon: 'mdi:account-key',
210
+ points: ['테넌트 데이터 검토', '커스텀 클레임 확인', '공급자 매핑 비교'],
211
+ },
212
+ ],
213
+ },
214
+ {
215
+ type: 'title',
216
+ text: '이 인스펙터가 명확하게 보여주는 일반적인 JWT 실수',
217
+ level: 3,
218
+ },
219
+ {
220
+ type: 'proscons',
221
+ title: '빠른 검사 vs 신뢰 결정',
222
+ items: [
223
+ {
224
+ pro: '잘못된 형식의 토큰을 즉시 확인할 수 있습니다.',
225
+ con: '예상하는 수신자나 발급자를 알 수 없습니다.',
226
+ },
227
+ {
228
+ pro: 'Unix 타임스탬프 클레임을 읽을 수 있는 날짜로 변환합니다.',
229
+ con: '실제 키 자료 없이는 서명을 검증할 수 없습니다.',
230
+ },
231
+ {
232
+ pro: '발급자, 수신자, 주체, 유형의 누락된 값을 찾습니다.',
233
+ con: '스코프와 역할이 애플리케이션에 안전하다는 것을 증명할 수 없습니다.',
234
+ },
235
+ ],
236
+ },
237
+ {
238
+ type: 'summary',
239
+ title: '모범 사례 워크플로',
240
+ items: [
241
+ '클라이언트나 API가 실제로 받은 내용을 이해하기 위해 토큰을 디코딩하세요.',
242
+ '애플리케이션 로직을 추적하기 전에 exp, nbf, iss, aud, sub, alg를 확인하세요.',
243
+ '서명과 신뢰 결정은 인증 레이어에서만 검증하세요.',
244
+ '민감한 운영 JWT를 티켓, 로그, 스크린샷에 공유하지 마세요.',
245
+ ],
246
+ },
247
+ ],
248
+ };
@@ -0,0 +1,247 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { JwtDecoderUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'jwt-decoder-parser-en-claims-inspecteur';
7
+ const title = 'JWT Decoder, Parser en Claims Inspecteur';
8
+ const description = 'Plak een JSON Web Token, decodeer de header en payload direct, inspecteer registered claims, herken verlopen tokens en kopieer schone JSON voor het debuggen van authenticatieprocessen.';
9
+
10
+ const howTo = [
11
+ {
12
+ name: 'Plak de JWT',
13
+ text: 'Kopieer een token uit een Authorization-header, cookie, logboekvermelding of identiteitsprovider en plak het in het invoerveld.',
14
+ },
15
+ {
16
+ name: 'Lees de gedecodeerde header en payload',
17
+ text: 'De tool splitst het token in header, payload en handtekening en toont de JSON-segmenten in aparte panels voor snelle inspectie.',
18
+ },
19
+ {
20
+ name: 'Controleer belangrijke claims',
21
+ text: 'Bekijk algoritme, uitgever, publiek, onderwerp, uitgegeven-op tijd, geldig-vanaf tijd en vervaltijd zonder handmatig Unix-timestamps om te rekenen.',
22
+ },
23
+ {
24
+ name: 'Kopieer de benodigde gegevens',
25
+ text: 'Kopieer een gedecodeerd gedeelte of de volledige gedecodeerde uitvoer wanneer je een opgeschoonde debugmomentopname met je team wilt delen.',
26
+ },
27
+ ];
28
+
29
+ const faq = [
30
+ {
31
+ question: 'Bewijst het decoderen van een JWT dat het token geldig is?',
32
+ answer: 'Nee. Decoderen onthult alleen de base64url-gecodeerde header en payload. Een token is pas betrouwbaar nadat de handtekening, uitgever, publiek, vervaldatum en gerelateerde claims zijn gevalideerd door de applicatie of identiteitsprovider.',
33
+ },
34
+ {
35
+ question: 'Kan ik deze JWT-decoder gebruiken voor access tokens en ID tokens?',
36
+ answer: 'Ja. De decoder is handig voor het inspecteren van OAuth access tokens, OpenID Connect ID tokens, sessietokens en service-to-service tokens, zolang ze het standaard driedelige JWT-formaat gebruiken.',
37
+ },
38
+ {
39
+ question: 'Waarom verifieert het handtekeningpaneel het token niet?',
40
+ answer: 'JWT-verificatie vereist de juiste geheime sleutel, publieke sleutel of JWKS-configuratie. Deze tool richt zich bewust op decoderen en inspecteren, zodat ontwikkelaars tokeninhoud kunnen zien zonder te doen alsof een zichtbare handtekeningstring bewijs van geldigheid is.',
41
+ },
42
+ {
43
+ question: 'Wat moet ik eerst controleren bij het debuggen van een JWT?',
44
+ answer: 'Begin met exp, nbf, iss, aud en alg. De meeste echte productieproblemen komen door verlopen tokens, klokafwijking, verkeerde publiek-waarden, onverwachte uitgever-URL\'s of onveilige algoritme-aannames.',
45
+ },
46
+ ];
47
+
48
+ const ui: JwtDecoderUI = {
49
+ tokenLabel: 'JWT-token',
50
+ tokenPlaceholder: 'Plak hier een JWT: header.payload.handtekening',
51
+ sampleButton: 'Voorbeeld laden',
52
+ clearButton: 'Wissen',
53
+ statusWaiting: 'Plak een token om de JSON-header, payload en claims te decoderen.',
54
+ statusValid: 'JWT succesvol gedecodeerd.',
55
+ statusInvalid: 'Dit lijkt geen geldige driedelige JWT te zijn.',
56
+ statusExpired: 'JWT gedecodeerd, maar de exp-claim is al verlopen.',
57
+ statusUnsigned: 'JWT gedecodeerd, maar het is niet ondertekend of gebruikt algoritme none.',
58
+ headerTitle: 'Header',
59
+ payloadTitle: 'Payload',
60
+ signatureTitle: 'Handtekening',
61
+ claimsTitle: 'Geregistreerde claims',
62
+ copyHeader: 'Gedecodeerde header kopieren',
63
+ copyPayload: 'Gedecodeerde payload kopieren',
64
+ copySignature: 'Handtekening kopieren',
65
+ copyAll: 'Alles kopieren',
66
+ copiedLabel: 'Gekopieerd',
67
+ invalidTokenTitle: 'Ongeldige JWT',
68
+ invalidTokenBody: 'Controleer of het token drie door punten gescheiden base64url-segmenten heeft.',
69
+ invalidSegmentError: 'Controleer of het token drie door punten gescheiden base64url-segmenten heeft.',
70
+ invalidDecodeError: 'De header of payload kon niet worden gedecodeerd als geldige JSON.',
71
+ emptyJson: '{}',
72
+ signaturePresent: 'Handtekeningsegment is aanwezig; verifieer het in uw auth-laag met de juiste sleutel.',
73
+ signatureMissing: 'Geen handtekeningsegment',
74
+ algorithmLabel: 'Algoritme',
75
+ typeLabel: 'Type',
76
+ issuerLabel: 'Uitgever',
77
+ subjectLabel: 'Onderwerp',
78
+ audienceLabel: 'Publiek',
79
+ issuedAtLabel: 'Uitgegeven op',
80
+ notBeforeLabel: 'Geldig vanaf',
81
+ expiresAtLabel: 'Verloopt op',
82
+ claimMissing: 'Niet aanwezig',
83
+ privacyNote: 'Decoderen vindt plaats in uw browsersessie. Plak geen productiesleutels in een tool tenzij uw beveiligingsbeleid dit toestaat.',
84
+ sampleToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnYW1lYm9iLXVzZXItNDIiLCJuYW1lIjoiR2FtZUJvYiBEZXZlbG9wZXIiLCJpc3MiOiJodHRwczovL3d3dy5nYW1lYm9iLmRldiIsImF1ZCI6ImRldmVsb3Blci10b29scyIsImlhdCI6MTcxNzIwMDAwMCwibmJmIjoxNzE3MjAwMDAwLCJleHAiOjE4OTM0NTYwMDAsInJvbGUiOiJhZG1pbiJ9.demo-signature',
85
+ };
86
+
87
+ const faqSchema: WithContext<FAQPage> = {
88
+ '@context': 'https://schema.org',
89
+ '@type': 'FAQPage',
90
+ mainEntity: faq.map((item) => ({
91
+ '@type': 'Question',
92
+ name: item.question,
93
+ acceptedAnswer: {
94
+ '@type': 'Answer',
95
+ text: item.answer,
96
+ },
97
+ })),
98
+ };
99
+
100
+ const howToSchema: WithContext<HowTo> = {
101
+ '@context': 'https://schema.org',
102
+ '@type': 'HowTo',
103
+ name: title,
104
+ description,
105
+ step: howTo.map((step, index) => ({
106
+ '@type': 'HowToStep',
107
+ position: index + 1,
108
+ name: step.name,
109
+ text: step.text,
110
+ })),
111
+ };
112
+
113
+ const appSchema: WithContext<SoftwareApplication> = {
114
+ '@context': 'https://schema.org',
115
+ '@type': 'SoftwareApplication',
116
+ name: title,
117
+ description,
118
+ applicationCategory: 'DeveloperApplication',
119
+ operatingSystem: 'Any',
120
+ offers: {
121
+ '@type': 'Offer',
122
+ price: '0',
123
+ priceCurrency: 'EUR',
124
+ },
125
+ };
126
+
127
+ export const content: ToolLocaleContent<JwtDecoderUI> = {
128
+ slug,
129
+ title,
130
+ description,
131
+ ui,
132
+ faqTitle: 'JWT decoder FAQ',
133
+ faq,
134
+ bibliographyTitle: 'JWT specificaties en beveiligingsreferenties',
135
+ bibliography,
136
+ howTo,
137
+ schemas: [appSchema, faqSchema, howToSchema],
138
+ seo: [
139
+ {
140
+ type: 'title',
141
+ text: 'Decodeer JWTs zonder de beveiligingscontext te verliezen',
142
+ level: 2,
143
+ },
144
+ {
145
+ type: 'paragraph',
146
+ html: 'Een JSON Web Token ziet er compact uit, maar bevat vaak precies het detail dat een authenticatiefout verklaart: het ondertekeningsalgoritme, uitgever, publiek, onderwerp, uitgegeven-op tijd, geldig-vanaf tijd, vervaldatum en toepassingsspecifieke autorisatieclaims. Deze <strong>JWT-decoder, parser en claims-inspecteur</strong> zet de drie tokensegmenten om in leesbare JSON zodat u auth-stromen sneller kunt debuggen.',
147
+ },
148
+ {
149
+ type: 'diagnostic',
150
+ variant: 'warning',
151
+ title: 'Gedecodeerd betekent niet vertrouwd',
152
+ html: 'Iedereen kan een JWT base64url-decoderen. Vertrouwen begint pas nadat uw applicatie de handtekening verifieert met de juiste geheime sleutel, publieke sleutel of JWKS, en vervolgens uitgever, publiek, vervaldatum en domeinspecifieke claims valideert. Gebruik deze tool om gegevens te inspecteren, niet om een token als authentiek te accepteren.',
153
+ },
154
+ {
155
+ type: 'title',
156
+ text: 'Wat elk JWT segment u vertelt',
157
+ level: 3,
158
+ },
159
+ {
160
+ type: 'table',
161
+ headers: ['Segment', 'Typische inhoud', 'Debugwaarde'],
162
+ rows: [
163
+ ['Header', 'Algoritme, tokentype en optionele sleutel-ID', 'Toont of het token HS256, RS256, ES256 of een andere verificatiestrategie verwacht.'],
164
+ ['Payload', 'Geregistreerde claims en applicatieclaims', 'Onthult identiteit, tenant, scopes, rollen, vervaldatum en publiek-mismatches.'],
165
+ ['Handtekening', 'Cryptografische handtekeningbytes gecodeerd als base64url', 'Bevestigt dat een handtekeningsegment bestaat, maar moet elders met de juiste sleutel worden geverifieerd.'],
166
+ ],
167
+ },
168
+ {
169
+ type: 'title',
170
+ text: 'Claims die meestal falende authenticatie verklaren',
171
+ level: 3,
172
+ },
173
+ {
174
+ type: 'list',
175
+ items: [
176
+ '<strong>exp:</strong> als het token is verlopen, kunnen de vernieuwingslogica of klokinstellingen onjuist zijn.',
177
+ '<strong>nbf:</strong> als het token nog niet actief is, kunnen server- en identiteitsproviderklokken uit sync zijn.',
178
+ '<strong>iss:</strong> als de uitgever-URL afwijkt van de configuratie, kan het token van de verkeerde tenant of omgeving komen.',
179
+ '<strong>aud:</strong> als het publiek niet overeenkomt met de API-identificatie, is het token voor een andere bron aangemaakt.',
180
+ '<strong>alg:</strong> als het algoritme onverwacht is, kan uw verificateur het token weigeren of een gevaarlijke configuratiefout blootleggen.',
181
+ ],
182
+ },
183
+ {
184
+ type: 'title',
185
+ text: 'Toepassingen van een JWT parser tijdens ontwikkeling',
186
+ level: 3,
187
+ },
188
+ {
189
+ type: 'comparative',
190
+ columns: 3,
191
+ items: [
192
+ {
193
+ title: 'Frontend debugging',
194
+ description: 'Inspecteer ID tokens en access tokens ontvangen na inloggen om scopes, rollen en profielclaims te bevestigen.',
195
+ icon: 'mdi:monitor-dashboard',
196
+ points: ['Controleer profielclaims', 'Bevestig scopes en rollen', 'Vergelijk inlogomgevingen'],
197
+ },
198
+ {
199
+ title: 'Backend API QA',
200
+ description: 'Vergelijk verwachte uitgevers- en publiek-waarden met het token dat daadwerkelijk in een Authorization-header is verzonden.',
201
+ icon: 'mdi:api',
202
+ highlight: true,
203
+ points: ['Valideer publiek-vorm', 'Herken uitgever-mismatches', 'Inspecteer bearer tokens'],
204
+ },
205
+ {
206
+ title: 'Identiteitsprovider configureren',
207
+ description: 'Controleer of claims van Auth0, Azure AD, Cognito, Keycloak of een aangepaste provider zijn vormgegeven zoals uw app verwacht.',
208
+ icon: 'mdi:account-key',
209
+ points: ['Bekijk tenantgegevens', 'Controleer aangepaste claims', 'Vergelijk providerkoppelingen'],
210
+ },
211
+ ],
212
+ },
213
+ {
214
+ type: 'title',
215
+ text: 'Veelvoorkomende JWT fouten die deze inspecteur zichtbaar maakt',
216
+ level: 3,
217
+ },
218
+ {
219
+ type: 'proscons',
220
+ title: 'Snelle controles versus vertrouwensbeslissingen',
221
+ items: [
222
+ {
223
+ pro: 'Zie misvormde tokens onmiddellijk.',
224
+ con: 'Kan uw verwachte publiek of uitgever niet kennen.',
225
+ },
226
+ {
227
+ pro: 'Converteer Unix-timestamp-claims naar leesbare datums.',
228
+ con: 'Kan geen handtekening verifieren zonder het echte sleutelmateriaal.',
229
+ },
230
+ {
231
+ pro: 'Herken ontbrekende uitgever-, publiek-, onderwerp- of typewaarden.',
232
+ con: 'Kan niet bewijzen dat scopes en rollen veilig zijn voor uw applicatie.',
233
+ },
234
+ ],
235
+ },
236
+ {
237
+ type: 'summary',
238
+ title: 'Best practice werkwijze',
239
+ items: [
240
+ 'Decodeer het token om te begrijpen wat de client of API daadwerkelijk heeft ontvangen.',
241
+ 'Controleer exp, nbf, iss, aud, sub en alg voordat u applicatielogica naloopt.',
242
+ 'Verifieer handtekeningen en vertrouwensbeslissingen alleen in uw auth-laag.',
243
+ 'Vermijd het delen van gevoelige productie-JWTs in tickets, logs of schermafbeeldingen.',
244
+ ],
245
+ },
246
+ ],
247
+ };