SSO를 sso overrides avatar: true와 함께 사용할 때, Discourse는 아바타를 다운로드하여 제공된 URL에 직접 링크하는 대신 항상 로컬에서 제공하는 것 같습니다.
제공된 avatar_url에서 아바타를 직접 서빙하도록 허용하는 것이 더 합리적이지 않을까요? 현재 방식은 표시되는 각 아바타마다 Discourse 백엔드를 다소 불필요하게 호출하게 됩니다. 이것이 SSO 옵션으로 추가될 수 있을까요?
아바타가 사라질 수 있다는 우려라면, 이미지의 onerror 이벤트를 사용하여 src를 로컬로 다운로드된 복사본(또는 기본 아바타)으로 폴백 처리하면 됩니다. 다만, 너무 큰 아바타 이미지를 CSS만으로 제한할 수 있는지는 잘 모르겠습니다.
1개의 좋아요
DrewH
(Drew)
6월 2, 2021, 2:05오후
2
download_remote_images_to_local을 비활성화하면 문제가 해결될 것으로 생각됩니다. 다만 이 경우 게시물 내 이미지가 로컬이 아닌 원격으로 제공되게 됩니다.
그것은 게시물에 있는 이미지에만 적용되는 것 같습니다. 또는 SSO에 의해 덮어쓰지 않은 경우 로컬 아바타에도 적용될 수 있습니다.
1개의 좋아요
DrewH
(Drew)
6월 2, 2021, 2:49오후
4
흥미롭네요. OIDC 플러그인이 모든 로그인 시 이메일을 덮어쓸 수 있다는 것을 알고 있습니다. 아바타도 SSO에 의해 덮어쓰기 가능하도록 이와 유사한 기능이 구현될 수 있을 것 같습니다.
Falco
(Falco)
6월 2, 2021, 4:24오후
5
SSO 아바타가 https://central.avatar.service/<username> 형식이라면, external_system_avatars_url 사이트 설정을 사용하여 이 기능을 사용할 수 있습니다.
우리의 경우에는 해당되지 않습니다(S3에서 제공되므로) — 그리고 효율적으로 캐싱할 수 있도록 그 형식으로 제공되는 경우는 드물 것입니다.
몇 년 전에 이 문제를 다시 살펴보니, 이전에 무언가를 잘못 이해했던 것 같지만, 여전히 성능 측면에서 쉽게 개선할 수 있는 부분이 있다고 생각합니다.
예전에는 아바타가 로컬에 저장된다고(디스코urs 서버 자체에) 생각했고, 왜 SSO 외부 아바타 URL에서 직접 서빙되지 않고 디스코urs에 요청이 가는지 궁금해했습니다. 하지만 직접 확인해 보니, SSO에서 오는 외부 아바타는 이미 객체 저장소(예: S3)에 업로드되어 있으며, 필요한 여러 크기로 변환되어 있는 것을 알게 되었습니다.
제가 이해한 바로는, 현재 디스코urs는 객체 저장소에서 클라이언트로 아바타를 프록시하고 있습니다. 하지만 이 동작은 SSO 외부 아바타를 사용할 때에만 해당되는 것 같습니다. 왜냐하면 메타(meta)에서 아바타는 (CDN이 적용된) 객체 저장소에서 직접 서빙되고 있기 때문입니다. 그러나 SSO를 외부 URL과 함께 사용할 경우, 아바타 URL은 다음과 같은 형태를 띱니다.
https://discourse-host/user_avatar/discourse-host/{username}/{size}/{uploadid}_{version}.png
이 경우, 각 아바타가 표시될 때마다(클라이언트에 캐시되기 전에) rails에 요청이 갑니다.
또한 코드를 살펴보면, 프록싱 대신 리다이렉트를 허용하는 설정이 있는 것도 확인했습니다. 하지만 그 시점에는 이미 rails에 요청이 도달한 상태이므로, 리다이렉트는 클라이언트의 로드 시간에만 추가 지연을 유발할 뿐입니다.
elsif upload && optimized = get_optimized_image(upload, size)
if optimized.local?
optimized_path = Discourse.store.path_for(optimized)
image = optimized_path if File.exist?(optimized_path)
elsif GlobalSetting.redirect_avatar_requests
return redirect_s3_avatar(Discourse.store.cdn_url(optimized.url))
else
return proxy_avatar(Discourse.store.cdn_url(optimized.url), upload.created_at)
end
end
아바타를 객체 저장소(가능하면 CDN을 통해 서빙)에 직접 링크하도록 하고, 동시에 rails 리소스를 일부 절약하는 것이 더 빠르지 않을까요? /cc @Falco
Falco
(Falco)
2월 19, 2024, 4:29오후
9
Paulo:
정리하면, 현재 Discourse가 오브젝트 스토리지에서 아바타를 클라이언트로 프록시하고 있다는 말씀이신가요? 다만 이 동작은 SSO 외부 아바타를 사용할 때만 적용되는 것 같아서요. 여기 메타 사이트의 아바타는 (CDN이 적용된) 오브젝트 스토리지에서 직접 로드되고 있기 때문입니다. 하지만 SSO를 외부 URL과 함께 사용할 경우, 아바타 URL은 다음과 같은 형태를 띱니다.
그렇지 않습니다. 기본적으로 Discourse는 여러분이 사이트에서 보시는 것처럼 아바타 요청을 프록시합니다.
다만, 지난해 아바타 요청을 리다이렉트하도록 하는 설정을 도입했습니다. DISCOURSE_REDIRECT_AVATAR_REQUESTS=1 환경 변수를 통해 이 설정을 활성화하면 여기에서 보시는 동작이 발생합니다.
1개의 좋아요