[{"data":1,"prerenderedAt":1047},["ShallowReactive",2],{"docs:\u002Fko\u002Fguide\u002Fdashboard":3},{"page":4,"untranslated":1046,"translated":73},{"id":5,"title":6,"body":7,"description":1037,"extension":1038,"meta":1039,"navigation":73,"path":1040,"publishedAt":1041,"seo":1042,"stem":1043,"updatedAt":1044,"__hash__":1045},"docs_ko\u002Fko\u002Fguide\u002Fdashboard.md","대시보드와 인증",{"type":8,"value":9,"toc":1016},"minimark",[10,14,26,31,36,149,156,160,178,188,192,198,260,313,317,367,506,510,525,551,602,606,635,720,747,751,770,777,781,787,791,800,804,825,829,841,845,849,867,873,877,899,913,917,942,946,957,969,975,987,999,1012],[11,12,6],"h1",{"id":13},"ダッシュボードと認証",[15,16,18],"callout",{"type":17},"warning",[19,20,21,25],"p",{},[22,23,24],"code",{},"auth","를 지정하지 않으면 REST API와 대시보드로 들어오는 모든 요청에 404로 응답합니다.",[27,28,30],"h2",{"id":29},"bearerauth","bearerAuth",[19,32,33,35],{},[22,34,30],{},"는 단일 토큰을 사용하여 요청을 인증합니다.",[37,38,43],"pre",{"className":39,"code":40,"language":41,"meta":42,"style":42},"language-ts shiki shiki-themes github-light github-dark","import { bearerAuth, defineTsumugi } from 'tsumugi';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: bearerAuth((env: Env) => env.TSUMUGI_TOKEN, { cookie: 'tsumugi_token' }),\n});\n","ts","",[22,44,45,68,75,95,101,143],{"__ignoreMap":42},[46,47,50,54,58,61,65],"span",{"class":48,"line":49},"line",1,[46,51,53],{"class":52},"szBVR","import",[46,55,57],{"class":56},"sVt8B"," { bearerAuth, defineTsumugi } ",[46,59,60],{"class":52},"from",[46,62,64],{"class":63},"sZZnC"," 'tsumugi'",[46,66,67],{"class":56},";\n",[46,69,71],{"class":48,"line":70},2,[46,72,74],{"emptyLinePlaceholder":73},true,"\n",[46,76,78,81,85,88,92],{"class":48,"line":77},3,[46,79,80],{"class":52},"const",[46,82,84],{"class":83},"sj4cs"," tsumugi",[46,86,87],{"class":52}," =",[46,89,91],{"class":90},"sScJk"," defineTsumugi",[46,93,94],{"class":56},"({\n",[46,96,98],{"class":48,"line":97},4,[46,99,100],{"class":56},"  performers,\n",[46,102,104,107,109,112,116,119,122,125,128,131,134,137,140],{"class":48,"line":103},5,[46,105,106],{"class":56},"  auth: ",[46,108,30],{"class":90},[46,110,111],{"class":56},"((",[46,113,115],{"class":114},"s4XuR","env",[46,117,118],{"class":52},":",[46,120,121],{"class":90}," Env",[46,123,124],{"class":56},") ",[46,126,127],{"class":52},"=>",[46,129,130],{"class":56}," env.",[46,132,133],{"class":83},"TSUMUGI_TOKEN",[46,135,136],{"class":56},", { cookie: ",[46,138,139],{"class":63},"'tsumugi_token'",[46,141,142],{"class":56}," }),\n",[46,144,146],{"class":48,"line":145},6,[46,147,148],{"class":56},"});\n",[19,150,151,152,155],{},"토큰은 위 예시처럼 함수를 통해 Secret에서 가져오세요.",[153,154],"br",{},"\n문자열로 직접 작성하면 리포지토리와 번들 모두에 토큰이 포함되므로 보안상 위험이 발생합니다.",[157,158,159],"h3",{"id":159},"cookie",[19,161,162,164,165,168,169,171,172,174,175,177],{},[22,163,159],{}," 옵션을 지정하면 ",[22,166,167],{},"Authorization"," 헤더 외에 지정한 이름의 cookie에 담긴 토큰도 검증합니다.",[153,170],{},"\n브라우저는 최초 HTML을 가져올 때 ",[22,173,167],{}," 헤더를 붙이지 않습니다.",[153,176],{},"\n대시보드를 열려면 이 설정이 반드시 필요합니다.",[19,179,180,181,183,184,187],{},"cookie를 이용한 인증은 CSRF의 대상이 될 수 있습니다.",[153,182],{},"\ncookie를 발급하는 쪽에서는 ",[22,185,186],{},"SameSite=Strict","를 명시적으로 지정하세요.",[27,189,191],{"id":190},"cloudflare-access","Cloudflare Access",[19,193,194,197],{},[22,195,196],{},"cloudflareAccess","를 지정하면 Cloudflare Access가 발급한 JWT를 검증합니다.",[37,199,201],{"className":39,"code":200,"language":41,"meta":42,"style":42},"import { cloudflareAccess, defineTsumugi } from 'tsumugi';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: cloudflareAccess({ teamDomain: 'example', aud: 'audience tag' }),\n});\n",[22,202,203,216,220,232,236,256],{"__ignoreMap":42},[46,204,205,207,210,212,214],{"class":48,"line":49},[46,206,53],{"class":52},[46,208,209],{"class":56}," { cloudflareAccess, defineTsumugi } ",[46,211,60],{"class":52},[46,213,64],{"class":63},[46,215,67],{"class":56},[46,217,218],{"class":48,"line":70},[46,219,74],{"emptyLinePlaceholder":73},[46,221,222,224,226,228,230],{"class":48,"line":77},[46,223,80],{"class":52},[46,225,84],{"class":83},[46,227,87],{"class":52},[46,229,91],{"class":90},[46,231,94],{"class":56},[46,233,234],{"class":48,"line":97},[46,235,100],{"class":56},[46,237,238,240,242,245,248,251,254],{"class":48,"line":103},[46,239,106],{"class":56},[46,241,196],{"class":90},[46,243,244],{"class":56},"({ teamDomain: ",[46,246,247],{"class":63},"'example'",[46,249,250],{"class":56},", aud: ",[46,252,253],{"class":63},"'audience tag'",[46,255,142],{"class":56},[46,257,258],{"class":48,"line":145},[46,259,148],{"class":56},[261,262,263,276],"table",{},[264,265,266],"thead",{},[267,268,269,273],"tr",{},[270,271,272],"th",{},"이름",[270,274,275],{},"내용",[277,278,279,293,303],"tbody",{},[267,280,281,287],{},[282,283,284],"td",{},[22,285,286],{},"teamDomain",[282,288,289,292],{},[22,290,291],{},"\u003Cteam>.cloudflareaccess.com","의 team 부분",[267,294,295,300],{},[282,296,297],{},[22,298,299],{},"aud",[282,301,302],{},"Access 애플리케이션의 audience tag",[267,304,305,310],{},[282,306,307],{},[22,308,309],{},"cacheTtlMs",[282,311,312],{},"JWKS를 다시 가져오는 간격. 기본값은 1시간",[27,314,316],{"id":315},"独自の認証","사용자 정의 인증",[19,318,319,320,322,323,325,326,329,330,332,333,335,336,339,340,332,343,345,346,348,349,345,351,353,354,356,357,359,360,363,364,366],{},"사용자 정의 인증을 구현하려면 ",[22,321,24],{}," 옵션에 함수를 지정합니다.",[153,324],{},"\n이 함수의 인수는 ",[22,327,328],{},"request","와 ",[22,331,115],{},"입니다.",[153,334],{},"\n이 함수의 반환값은 ",[22,337,338],{},"Response"," 또는 ",[22,341,342],{},"undefined",[153,344],{},"\n반환값이 ",[22,347,342],{},"이면 인증에 성공한 것이며, Tsumugi는 요청 처리를 계속합니다.",[153,350],{},[22,352,338],{},"이면 인증에 실패한 것이며, Tsumugi는 해당 ",[22,355,338],{},"로 응답하고 처리를 종료합니다.",[153,358],{},"\n예를 들어 ",[22,361,362],{},"findSession","으로 세션을 확인하고, 세션이 없으면 401 ",[22,365,338],{},"를 반환하도록 구현할 수 있습니다.",[37,368,370],{"className":39,"code":369,"language":41,"meta":42,"style":42},"import { defineTsumugi } from 'tsumugi';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: async (request, env: Env) => {\n    const session = await findSession(request, env);\n    return session ? undefined : Response.json({ error: 'unauthorized' }, { status: 401 });\n  },\n});\n",[22,371,372,385,389,401,405,437,456,495,501],{"__ignoreMap":42},[46,373,374,376,379,381,383],{"class":48,"line":49},[46,375,53],{"class":52},[46,377,378],{"class":56}," { defineTsumugi } ",[46,380,60],{"class":52},[46,382,64],{"class":63},[46,384,67],{"class":56},[46,386,387],{"class":48,"line":70},[46,388,74],{"emptyLinePlaceholder":73},[46,390,391,393,395,397,399],{"class":48,"line":77},[46,392,80],{"class":52},[46,394,84],{"class":83},[46,396,87],{"class":52},[46,398,91],{"class":90},[46,400,94],{"class":56},[46,402,403],{"class":48,"line":97},[46,404,100],{"class":56},[46,406,407,410,413,416,419,421,424,426,428,430,432,434],{"class":48,"line":103},[46,408,409],{"class":90},"  auth",[46,411,412],{"class":56},": ",[46,414,415],{"class":52},"async",[46,417,418],{"class":56}," (",[46,420,328],{"class":114},[46,422,423],{"class":56},", ",[46,425,115],{"class":114},[46,427,118],{"class":52},[46,429,121],{"class":90},[46,431,124],{"class":56},[46,433,127],{"class":52},[46,435,436],{"class":56}," {\n",[46,438,439,442,445,447,450,453],{"class":48,"line":145},[46,440,441],{"class":52},"    const",[46,443,444],{"class":83}," session",[46,446,87],{"class":52},[46,448,449],{"class":52}," await",[46,451,452],{"class":90}," findSession",[46,454,455],{"class":56},"(request, env);\n",[46,457,459,462,465,468,471,474,477,480,483,486,489,492],{"class":48,"line":458},7,[46,460,461],{"class":52},"    return",[46,463,464],{"class":56}," session ",[46,466,467],{"class":52},"?",[46,469,470],{"class":83}," undefined",[46,472,473],{"class":52}," :",[46,475,476],{"class":56}," Response.",[46,478,479],{"class":90},"json",[46,481,482],{"class":56},"({ error: ",[46,484,485],{"class":63},"'unauthorized'",[46,487,488],{"class":56}," }, { status: ",[46,490,491],{"class":83},"401",[46,493,494],{"class":56}," });\n",[46,496,498],{"class":48,"line":497},8,[46,499,500],{"class":56},"  },\n",[46,502,504],{"class":48,"line":503},9,[46,505,148],{"class":56},[27,507,509],{"id":508},"認証しない構成","인증하지 않는 구성",[15,511,513],{"type":512},"danger",[19,514,515,518,519,521,522,524],{},[22,516,517],{},"unsafeNoAuth","를 지정하면 REST API와 대시보드는 인증을 요구하지 않습니다.",[153,520],{},"\nWorker에 접근할 수 있는 모든 사용자가 payload를 포함한 잡의 내용을 열람하고, 잡을 투입, 취소, 재실행할 수 있습니다.",[153,523],{},"\n공개 환경에서는 사용하지 마세요.",[19,526,527,529,530,532,533,536,537,539,540,542,543,545,546,548,550],{},[22,528,517],{},"는 Tsumugi보다 앞단에서 인증하고 있는 경우에만 사용하세요.",[153,531],{},"\nCloudflare Access를 라우트 전체에 적용한 구성이나 ",[22,534,535],{},"wrangler dev","에서의 동작 확인이 해당합니다.",[153,538],{},"\n인증하지 않을 때는 ",[22,541,24],{},"를 생략하지 말고 ",[22,544,517],{},"를 명시하세요.",[153,547],{},[22,549,517],{},"를 지정하는 동안 로그에 경고가 출력됩니다.",[37,552,554],{"className":39,"code":553,"language":41,"meta":42,"style":42},"import { defineTsumugi, unsafeNoAuth } from 'tsumugi';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: unsafeNoAuth(),\n});\n",[22,555,556,569,573,585,589,598],{"__ignoreMap":42},[46,557,558,560,563,565,567],{"class":48,"line":49},[46,559,53],{"class":52},[46,561,562],{"class":56}," { defineTsumugi, unsafeNoAuth } ",[46,564,60],{"class":52},[46,566,64],{"class":63},[46,568,67],{"class":56},[46,570,571],{"class":48,"line":70},[46,572,74],{"emptyLinePlaceholder":73},[46,574,575,577,579,581,583],{"class":48,"line":77},[46,576,80],{"class":52},[46,578,84],{"class":83},[46,580,87],{"class":52},[46,582,91],{"class":90},[46,584,94],{"class":56},[46,586,587],{"class":48,"line":97},[46,588,100],{"class":56},[46,590,591,593,595],{"class":48,"line":103},[46,592,106],{"class":56},[46,594,517],{"class":90},[46,596,597],{"class":56},"(),\n",[46,599,600],{"class":48,"line":145},[46,601,148],{"class":56},[27,603,605],{"id":604},"ダッシュボードの有効化","대시보드 활성화",[19,607,608,611,612,615,616,611,619,622,623,626,627,629,631,632,634],{},[22,609,610],{},"tsumugi\u002Fui","의 ",[22,613,614],{},"ui()","를 ",[22,617,618],{},"defineTsumugi",[22,620,621],{},"ui","에 전달하면 ",[22,624,625],{},"\u002Fapi"," 이외의 경로로 들어오는 GET 요청에 대시보드의 HTML로 응답합니다.",[153,628],{},[22,630,621],{},"를 지정하지 않으면 대시보드는 번들에 포함되지 않습니다.",[153,633],{},"\nAPI가 401로 응답하면 대시보드는 토큰 입력란을 표시합니다.",[37,636,638],{"className":39,"code":637,"language":41,"meta":42,"style":42},"import { ui } from 'tsumugi\u002Fui';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: bearerAuth((env: Env) => env.TSUMUGI_TOKEN, { cookie: 'tsumugi_token' }),\n  ui: ui({ tokenCookie: 'tsumugi_token' }),\n});\n",[22,639,640,654,658,670,674,702,716],{"__ignoreMap":42},[46,641,642,644,647,649,652],{"class":48,"line":49},[46,643,53],{"class":52},[46,645,646],{"class":56}," { ui } ",[46,648,60],{"class":52},[46,650,651],{"class":63}," 'tsumugi\u002Fui'",[46,653,67],{"class":56},[46,655,656],{"class":48,"line":70},[46,657,74],{"emptyLinePlaceholder":73},[46,659,660,662,664,666,668],{"class":48,"line":77},[46,661,80],{"class":52},[46,663,84],{"class":83},[46,665,87],{"class":52},[46,667,91],{"class":90},[46,669,94],{"class":56},[46,671,672],{"class":48,"line":97},[46,673,100],{"class":56},[46,675,676,678,680,682,684,686,688,690,692,694,696,698,700],{"class":48,"line":103},[46,677,106],{"class":56},[46,679,30],{"class":90},[46,681,111],{"class":56},[46,683,115],{"class":114},[46,685,118],{"class":52},[46,687,121],{"class":90},[46,689,124],{"class":56},[46,691,127],{"class":52},[46,693,130],{"class":56},[46,695,133],{"class":83},[46,697,136],{"class":56},[46,699,139],{"class":63},[46,701,142],{"class":56},[46,703,704,707,709,712,714],{"class":48,"line":145},[46,705,706],{"class":56},"  ui: ",[46,708,621],{"class":90},[46,710,711],{"class":56},"({ tokenCookie: ",[46,713,139],{"class":63},[46,715,142],{"class":56},[46,717,718],{"class":48,"line":458},[46,719,148],{"class":56},[261,721,722,730],{},[264,723,724],{},[267,725,726,728],{},[270,727,272],{},[270,729,275],{},[277,731,732],{},[267,733,734,739],{},[282,735,736],{},[22,737,738],{},"tokenCookie",[282,740,741,742,611,744,746],{},"토큰을 저장하는 cookie의 이름. ",[22,743,30],{},[22,745,159],{},"와 같은 값",[27,748,750],{"id":749},"ジョブの一覧","잡 목록",[19,752,753,754,756,757,423,760,763,764,766,767,769],{},"잡 목록에서는 상태, binding, 생성 일시의 범위로 필터링하고, 페이징과 열별 정렬을 조작할 수 있습니다.",[153,755],{},"\n잡 ID, ",[22,758,759],{},"uniqueKey",[22,761,762],{},"concurrencyKey","로 검색하는 기능도 갖추고 있습니다.",[153,765],{},"\n잡 상세 페이지에는 시도 이력, 진행 상황, 로그, 트레이스 정보가 표시됩니다.",[153,768],{},"\n수동 재시도와 취소, 선택한 잡의 일괄 재시도와 일괄 취소, 잡 투입도 잡 목록 페이지에서 조작합니다.",[19,771,772],{},[773,774],"img",{"alt":775,"src":776},"잡 목록 페이지","\u002Fdashboard-jobs.jpg",[157,778,780],{"id":779},"検索","검색",[19,782,783,784,786],{},"검색란에 입력한 값은 완전 일치로 검색됩니다.",[153,785],{},"\n잡 ID 형식과 일치하는 값을 입력하면 해당 잡의 상세 정보가 표시됩니다.",[157,788,790],{"id":789},"一括操作","일괄 처리",[19,792,793,794,796,797,799],{},"행 왼쪽 끝의 체크박스로 잡을 선택합니다.",[153,795],{},"\n머리글 행의 체크박스는 표시 중인 모든 행을 선택합니다.",[153,798],{},"\n1건 이상을 선택하면 선택한 잡을 한꺼번에 재시도하거나 취소하는 메뉴가 표시됩니다.",[157,801,803],{"id":802},"表示の設定","표시 설정",[19,805,806,807,809,810,812,813,815,816,818,819,821,822,824],{},"표시 설정은 브라우저에 저장되며 다음번 이후에도 적용됩니다.",[153,808],{},"\n갱신 간격은 Off, 1s, 3s, 10s, 30s, 1m 중에서 선택하며, 기본값은 3초입니다.",[153,811],{},"\n열 표시는 ID, Started at, Updated at, Attempts, Processing time을 전환할 수 있습니다.",[153,814],{},"\nBinding과 Status는 항상 표시됩니다.",[153,817],{},"\n한 페이지당 건수는 10, 20, 30, 50 중에서 선택합니다.",[153,820],{},"\n언어는 사이드바 하단에서 일본어와 English를 전환합니다.",[153,823],{},"\n처음에는 브라우저의 언어 설정을 따릅니다.",[157,826,828],{"id":827},"時刻の表示","시각 표시",[19,830,831,832,834,835,837,838,840],{},"정기 실행의 시각은 각 스케줄의 타임존으로 표시됩니다.",[153,833],{},"\n그 외의 시각은 브라우저의 IANA 타임존으로 표시됩니다.",[153,836],{},"\n모든 시각에는 IANA 타임존과 GMT 오프셋이 함께 표시됩니다.",[153,839],{},"\n생성 일시의 범위는 브라우저의 로컬 날짜 기준 연월일로 지정합니다.",[27,842,844],{"id":843},"ジョブの詳細","잡 상세",[157,846,848],{"id":847},"試行履歴","시도 이력",[19,850,851,852,854,855,860,861,863,864,866],{},"시도별 시작 시각, 종료 시각, 오류가 잡 상세에 표시됩니다.",[153,853],{},"\n저장되는 건수와 오류 본문 길이의 상한은 ",[856,857,859],"a",{"href":858},"\u002Fko\u002Fguide\u002Fperformer#%E5%A4%B1%E6%95%97%E3%81%A8%E3%83%AA%E3%83%88%E3%83%A9%E3%82%A4","실패와 재시도","를 참조하세요.",[153,862],{},"\n시도 이력은 잡 상세의 응답에만 포함되고, 목록의 응답에는 포함되지 않습니다.",[153,865],{},"\n첫 번째 시도에서 성공한 경우는 이력에 기록되지 않습니다.",[19,868,869],{},[773,870],{"alt":871,"src":872},"시도 이력 표시","\u002Fdashboard-attempts.jpg",[157,874,876],{"id":875},"ログとトレース情報","로그와 트레이스 정보",[19,878,879,882,883,885,886,888,889,891,892,860,896,898],{},[22,880,881],{},"ctx.log()","로 저장한 메시지는 수신 순서대로 잡 상세에 표시됩니다.",[153,884],{},"\n각 로그에는 시도 횟수, 기록 시각, 본문이 포함됩니다.",[153,887],{},"\n실행 중인 잡의 로그도 표시되지만, 표시되기까지 시간이 걸릴 수 있습니다.",[153,890],{},"\n저장되는 건수, 본문 길이, 저장 간격의 상한은 ",[856,893,895],{"href":894},"\u002Fko\u002Fguide\u002Fperformer#%E3%83%AD%E3%82%B0","로그",[153,897],{},"\n로그의 보존 기간은 잡의 보존 기간과 같습니다.",[19,900,901,902,905,906,908,909,860],{},"투입 시 ",[22,903,904],{},"traceparent","를 지정한 잡에서는 그 값이 잡 상세에 표시됩니다.",[153,907],{},"\nperformer에서의 사용 방법은 ",[856,910,912],{"href":911},"\u002Fko\u002Fguide\u002Fperformer#%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E6%83%85%E5%A0%B1","트레이스 정보",[157,914,916],{"id":915},"リトライ可否の表示","재시도 가능 여부 표시",[19,918,919,920,923,924,926,928,929,339,932,935,936,938,939,941],{},"목록의 각 행에는 ",[22,921,922],{},"retryable","이 포함됩니다.",[153,925],{},[22,927,922],{},"은 잡이 ",[22,930,931],{},"FAILED",[22,933,934],{},"STALLED"," 상태이면서 보존 기간 내에 있는지를 나타내는 지표입니다.",[153,937],{},"\n재시도의 성공은 보장되지 않습니다.",[153,940],{},"\n보존 기간이 지난 잡에 대한 재시도 요청에는 REST API가 410으로 응답합니다.",[27,943,945],{"id":944},"runs","Runs",[19,947,948,951,952,954,956],{},[22,949,950],{},"flows","를 설정한 경우 사이드바에 Runs 항목이 표시됩니다.",[153,953],{},[22,955,950],{},"가 비어 있으면 표시되지 않습니다.",[19,958,959,960,962,963,965,966,968],{},"Run 목록은 Flow, 상태, node의 진행 상황을 표시합니다.",[153,961],{},"\nFlow 또는 상태를 지정하면 일치하는 Run만 목록에 표시됩니다.",[153,964],{},"\n행을 선택하면 상세 패널이 열립니다.",[153,967],{},"\n상세 패널은 그래프와 워터폴의 두 가지 표시를 제공합니다.",[19,970,971],{},[773,972],{"alt":973,"src":974},"Run의 워터폴","\u002Fdashboard-run.jpg",[19,976,977,978,980,981,983,984,986],{},"워터폴은 각 node의 실행 시간을 시간축 위에 나열한 표시입니다.",[153,979],{},"\n그래프는 node의 의존 관계, 각 node의 상태, fan-out node의 자식 node의 진행 상황을 표시합니다.",[153,982],{},"\n자식 node는 24건까지 표시되며, 초과분은 상태별 건수로 나타냅니다.",[153,985],{},"\n워터폴의 행이나 그래프의 node를 선택하면 해당 잡의 상세 정보가 열립니다.",[19,988,989,990,992,993,995,996,998],{},"subflow로 시작된 Run의 상세에는 부모 Run의 ID가 링크로 표시됩니다.",[153,991],{},"\n이 링크를 선택하면 부모 Run의 상세 정보가 열립니다.",[153,994],{},"\n그래프 위의 subflow node에는 자식 Run의 상세 정보를 여는 버튼이 있습니다.",[153,997],{},"\n워터폴의 subflow 행을 선택해도 자식 Run의 상세 정보가 열립니다.",[19,1000,1001,1002,1004,1005,1007,1008,1011],{},"Run의 시작, 재개, 취소는 Runs 페이지에서 조작합니다.",[153,1003],{},"\n재개의 대상은 ",[22,1006,931],{}," 상태의 Run이고, 취소의 대상은 ",[22,1009,1010],{},"RUNNING"," 상태의 Run입니다.",[1013,1014,1015],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":42,"searchDepth":77,"depth":77,"links":1017},[1018,1021,1022,1023,1024,1025,1031,1036],{"id":29,"depth":70,"text":30,"children":1019},[1020],{"id":159,"depth":77,"text":159},{"id":190,"depth":70,"text":191},{"id":315,"depth":70,"text":316},{"id":508,"depth":70,"text":509},{"id":604,"depth":70,"text":605},{"id":749,"depth":70,"text":750,"children":1026},[1027,1028,1029,1030],{"id":779,"depth":77,"text":780},{"id":789,"depth":77,"text":790},{"id":802,"depth":77,"text":803},{"id":827,"depth":77,"text":828},{"id":843,"depth":70,"text":844,"children":1032},[1033,1034,1035],{"id":847,"depth":77,"text":848},{"id":875,"depth":77,"text":876},{"id":915,"depth":77,"text":916},{"id":944,"depth":70,"text":945},"REST API와 대시보드의 인증 설정, 그리고 대시보드에서 잡과 Run을 조회, 검색, 일괄 처리하는 방법에 대해","md",{},"\u002Fko\u002Fguide\u002Fdashboard","2026-07-22",{"title":6,"description":1037},"ko\u002Fguide\u002Fdashboard","2026-10-30","nKt0X2FR8cUlvKbbLDY88em5i9J7IhKeWfJ1_W156Nc",false,1794027574054]