이 문서는 출시된 Crowd 7.0.x 릴리즈 노트를 공유하기 위해 작성되었다.

하이라이트



OAuth 2.0을 사용하는 REST API를 통해 서비스 계정을 생성

서비스 계정은 자동화된 프로세스와 외부 통합을 안전하고 효율적으로 관리하기 위해 생성된 특수 비사용자 계정입니다.

이제 OAuth 2.0 인증을 사용하는 REST API를 통해 이러한 계정을 생성할 수 있습니다.

bookmark tabs REST API를 사용하여 서비스 계정을 생성하는 방법


사전 공지

Atlassian은 제품 전반에 걸쳐 서비스 계정을 더욱 쉽게 생성할 수 있도록 새로운 사용자 인터페이스를 개발 중입니다. 의견이나 질문이 있으시면 언제든 알려주세요.

OAuth 2.0을 사용하여 디렉터리를 동기화

Crowd 디렉터리 동기화는 이제 데이터 센터 제품의 기본 연결 방식으로 OAuth 2.0을 지원합니다. 기본 인증도 계속 사용할 수 있습니다.

연결된 제품을 OAuth 2.0으로 업데이트하여 디렉터리 동기화를 지원하고 보안을 강화하세요.

기존 통합 기능은 계속 작동하지만, OAuth 2.0으로 마이그레이션하는 것을 권장합니다.

bookmark tabs Crowd에서 OAuth 2.0 디렉터리 동기화 설정하기

Struts 7.0 업그레이드

새로운 기능과 강화된 보안을 제공하기 위해 Struts 7.0으로 업그레이드했습니다.

이번 업데이트는 삼각한 취약점을 해결화고 최신 보안 조치를 도입하여 더욱 안전하고 안정적인 환경을 제공합니다.

서블릿 API 외에도 주요 업데이트 사항은 패키지 이름이 com.opensymphony.xwork2 에서 org.apache.struts2 로 변경된 것입니다.

호환성을 보장하기 위해 관련 가져오기 (import) 를 모두 업데이트하는 것이 좋습니다.

Freemarker 템플릿 지원을 제거했습니다.

보다 안전한 개발 환경을 위해 Freemarker 템플릿 지원을 중단합니다. Soy 또는 Apache Velocity 템플릿과 같은 다른 템플릿 기술을 사용하도록 앱을 업데이트하세요.

Apache Velocity 및 Soy 템플릿 지원 추가

이제 서버 측에서 동적 콘텐츠를 렌더링하기 위해 Apache Velocity 및 Soy 템플릿을 지원합니다.

이러한 템플릿은 보안과 유연성을 향상시켜 인스턴스에서 사용자 지정 기능을 더 쉽게 구축하고 유지 관리할 수 있도록 합니다.

새로운 플러그인 모듈

Struts 모듈

Struts 플러그인 모듈이 기존의 사용되지 않는 xwork 모듈을 대체합니다. 기존 xwork 모듈은 Crowd 8.0에서 제거될 예정입니다.

향후 Crowd 릴리스와의 호환성을 유지하려면 통합 기능을 Struts 모듈을 사용하도록 업데이트하세요.

bookmark tabs Struts Module

Velocity Allowlist 모듈

Velocity Allowlist 모듈을 사용하면 앱 개발자가 Velocity 템플릿에서 호출될 수 있는 플러그인 클래스 메서드를 허용 목록에 추가할 수 있습니다.

bookmark tabs Velocity Allowlist plugin module

보안 및 사용성 업데이트

Jakarta 도입 및 기본 기술의 주요 버전 업그레이드와 같이 모든 Atlassian Data Center 제품에 공통적으로 적용되는 몇 가지 업데이트를 구현했습니다.

이 업그레이드는 두 부분으로 나눌 수 있습니다.

  • 백엔드 업데이트 내용:
    • Spring 6

    • Tomcat 10

    • Ehcache 3

    • Atlassian Central Visibility plugin 3

bookmark tabs 백엔드 업데이트에 대한 상세 문서


업데이트된 Tomcat 프로토콜

Crowd에서 제공하는 프로토콜을 업데이트하여 Tomcat 프로토콜에 비밀번호 암호화 지원 기능을 추가했습니다.

Crowd 프로토콜

Tomcat 프로토콜 기반

암호 암호화에 지원되는 속성

com.atlassian.secrets.tomcat.protocol.Http11NioProtocolWithPasswordEncryption

Http11NioProtocol

  • KeystorePass
  • KeyPass
  • SSLPassword
  • TruststorePass

com.atlassian.secrets.tomcat.protocol.Http11Nio2ProtocolWithPasswordEncryption

Http11Nio2Protocol

  • KeystorePass
  • KeyPass
  • SSLPassword
  • TruststorePass

com.atlassian.secrets.tomcat.protocol.AjpNioProtocolWithPasswordEncryption

AjpNio프로토콜

  • secrets

com.atlassian.secrets.tomcat.protocol.AjpNio2ProtocolWithPasswordEncryption

AjpNio2프로토콜

  • secret


해당 APR/Native라이브러리, Http11AprProtocol커넥터 및 AjpAprProtocol커넥터는 Tomcat 10에서 더 이상 사용되지 않으며 Tomcat 10.1.x에서 제거될 예정입니다.

결과적으로, 해당 com.atlassian.secrets.tomcat.protocol.AjpAprProtocolWithPasswordEncryption와 com.atlassian.secrets.tomcat.protocol.Http11AprProtocolWithPasswordEncryption 프로토콜은 Crowd 7.0에서 더 이상 지원되지 않습니다.

보안에 취약하고 더 이상 사용되지 않는 구성 요소 제거

보안에 취약한 com.sun.activation com.sun.mail 를 업데이트하고 마이그레이션했습니다.

또한 과거에 사용이 중단된 아래 구성 요소들을 제거했습니다.

요소

제거됨

Crowd Core

클래스: com.atlassian.crowd.embedded.propertyset.DateFormats

다음 위치에 있는 Public static methods and fields: 

  • com.atlassian.crowd.embedded.api.Directories

  • com.atlassian.crowd.model.application.Applications

  • com.atlassian.crowd.model.user.Users

  • com.atlassian.crowd.model.group.Groups

클래스: com.atlassian.crowd.embedded.directory.LdapConnectionPoolInitialisationListener

클래스: com.atlassian.crowd.directory.query.MicrosoftGraphQueryParams

Crowd API

com.atlassian.crowd.embedded.api.AttributesSynchronisableDirectoryProperties:

  • CURRENT_START_SYNC_TIME

  • LAST_START_SYNC_TIME

  • LAST_SYNC_DURATION_MS

  • IS_SYNCHRONISING

Public methods:

  • com.atlassian.crowd.integration.http.CrowdHttpAuthenticator#isAuthenticated

  • com.atlassian.crowd.integration.http.CrowdHttpAuthenticator#rememberMeLoginToCrowd

  • com.atlassian.crowd.service.CrowdRememberMeService#createCookie

Crowd 복원 기능에 변경 사항

이제 XML 파일을 사용하여 Crowd 를 복원하려면 파일 이름만 있으면 됩니다.

Crowd 를 복원하려면 다음 단계를 따르세요.

  1. crowd-home/import 디렉터리에 XML 파일이 있는지 확인
  2. XML 파일을 crowd-home/import 디렉터리에 복사
  3. 파일 이름만 입력

이 과정은 사용자 가져오기 기능과 동일합니다.

bookmark tabs Crowd Backing Up and Restoring Data

기본적으로 Scheduled Backup은 비활성화

Crowd 7부터 스케줄 백업은 기본적으로 비활성화되어 있습니다. 이전 버전에서 업그레이드하거나 백업에서 복원하는 경우 기존 백업 구성은 변경되지 않으며 현재 설정이 이전에 구성된 대로 유지됩니다.

사용자 및 그룹 속성 동기화 기능 사용 중단 예정

외부 디렉터리에서 사용자 및 그룹 속성을 동기화하는 기능을 더 이상 사용하지 않도록 권장합니다.

이 기능은 특정 접두사를 가진 사용자 및 그룹 속성을 외부 디렉터리와 동기화하는 비공식 기능이었습니다. 이 기능은 비활성화되어 있었으며 디렉터리 속성을 통해서만 활성화할 수 있었습니다.


이 기능을 활성화하면, Crowd logger에서 com.atlassian.crowd.directory.synchronisation.cache.AbstractCacheRefresher 에서 다음과 같은 오류 메시지가 기록됩니다.

"This functionality is deprecated and will be removed in a future Crowd version.”

현재로서는 이 기능을 대체할 계획은 없습니다.

새로운 인증 API로 마이그레이션

com.atlassian.crowd.manager.authentication.TokenAuthenticationManager 이 기능은 더 이상 사용하지 않도록 권장합니다.

보다 안전한 대안으로 Crowd에서 사용자 인증 및 로그아웃을 위한 com.atlassian.crowd.service.authentication.CrowdApplicationAuthenticationService 서비스를 사용하세요.

이 서비스는 감사 로그 항목도 지원하므로 인증 및 로그아웃 작업에 대한 가시성이 향상됩니다.

TokenAuthenticationManager 에서 제공되는 다른 기능들은 Crowd의 API에서 사용되지 않을 것입니다.

Google Apps 커넥터 지원 중단

Crowd 7.0부터 Google Apps Connector 지원이 중단됩니다. SSO 환경이 필요한 경우 외부 ID 공급자 (IdP) 를 사용하는 것이 좋습니다.


현재 Google Apps 커넥터 기능은 기본적으로 차단되어 있습니다. 하지만 Google Apps 커넥터 구성은 자동으로 제거되지 않으며 다음과 같은 경고 메시지가 표시됩니다.

The Google Apps connector is enabled in your Crowd instance. This connector is no longer supported and will be removed in future Crowd versions. We recommend that you disable the connector and remove it from your instance.


Google Apps 커넥터를 영구적으로 제거하려면 다음 단계를 따르세요.

  1. Crowd에 로그인
  2. Applications 탭으로 이동
  3. Google Apps 선택
  4. "애플리케이션 제거"를 선택하고 제거 확인

커넥터를 제거하면 경고 메시지가 사라집니다.

bookmark tabs Configuring the Google Apps Connector

글로벌 직렬화 필터

Atlassian은 Java 역직렬화, Velocity, Struts 및 XStream 에 대한 중앙 차단 목록을 사용하는 전역 직렬화 필터를 구현하고 있습니다.

이 필터는 공개적으로 알려진 가젯 체인을 통해 원격 코드 실행 (RCE) 에 취약한 것으로 인식되는 특정 클래스 및 패턴을 차단하도록 설계되었습니다.

  • br.com.anteros.dbcp.AnterosDBCPConfig
  • com.sun.corba.se.impl.activation.ServerTableEntry
  • com.sun.tools.javac.processing.JavacProcessingEnvironment$NameProcessIterator
  • org.apache.commons.collections.comparators.TransformingComparator
  • org.apache.commons.collections.comparators.ComparableComparator

  • java.lang.ProcessBuilder

  • javax.imageio.ImageIO$ContainsFilter

  • jdk.nashorn.internal.objects.NativeString

  • sun.awt.datatransfer.DataTransferer$IndexOrderComparator

  • sun.swing.SwingLazyValue

  • .*\$LazyIterator

  • .*\.Lazy(?:Search)?Enumeration.*

  • .*\$GetterSetterReflection

  • .*\$PrivilegedGetter

  • (?:java|sun)\.rmi\..*

  • javax\.crypto\..*

  • .*\$ServiceNameIterator

  • javafx\.collections\.ObservableList\$.*

  • .*\.bcel\..*\.util\.ClassLoader

  • org.apache.commons.collections.comparators.ComparableComparator

  • org.apache.commons.collections.comparators.TransformingComparator

  • External sources

  • org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap

  • bsh.Interpreter

  • ^com\.mchange\.v2\.c3p0\..*DataSource$

  • org.apache.click.control.Column$ColumnComparator

  • clojure.inspector.proxy$javax.swing.table.AbstractTableModel$ff19274a

  • clojure.lang.PersistentArrayMap

  • org.apache.commons.beanutils.BeanComparator

  • org.apache.commons.collections.functors.InvokerTransformer

  • org.apache.commons.collections.functors.InstantiateTransformer

  • org.apache.commons.collections.functors.ChainedTransformer

  • org.apache.commons.collections.functors.ConstantTransformer

  • org.apache.commons.collections.map.LazyMap

  • org.apache.commons.collections4.functors.InvokerTransformer

  • org.apache.commons.collections4.functors.InstantiateTransformer

  • org.apache.commons.collections4.comparators.TransformingComparator

  • org.apache.commons.collections4.functors.ChainedTransformer

  • org.apache.commons.collections4.functors.ConstantTransformer

  • org.apache.commons.fileupload.disk.DiskFileItem

  • org.codehaus.groovy.runtime.ConvertedClosure

  • org.codehaus.groovy.runtime.MethodClosure

  • org.hibernate.engine.spi.TypedValue

  • org.hibernate.tuple.component.AbstractComponentTuplizer

  • org.hibernate.tuple.component.PojoComponentTuplizer

  • com.sun.rowset.JdbcRowSetImpl

  • org.jboss.interceptor.builder.InterceptionModelBuilder

  • org.jboss.interceptor.builder.MethodReference

  • org.jboss.interceptor.proxy.DefaultInvocationContextFactory

  • org.jboss.interceptor.proxy.InterceptorMethodHandler

  • org.jboss.interceptor.reader.ClassMetadataInterceptorReference

  • org.jboss.interceptor.reader.DefaultMethodMetadata

  • org.jboss.interceptor.reader.ReflectiveClassMetadata

  • org.jboss.interceptor.reader.SimpleInterceptorMetadata

  • org.jboss.interceptor.spi.instance.InterceptorInstantiator

  • org.jboss.interceptor.spi.metadata.InterceptorReference

  • org.jboss.interceptor.spi.metadata.MethodMetadata

  • org.jboss.interceptor.spi.model.InterceptionModel

  • org.jboss.interceptor.spi.model.InterceptionType

  • org.jboss.weld.interceptor.builder.InterceptionModelBuilder

  • org.jboss.weld.interceptor.builder.MethodReference

  • org.jboss.weld.interceptor.proxy.DefaultInvocationContextFactory

  • org.jboss.weld.interceptor.proxy.InterceptorMethodHandler

  • org.jboss.weld.interceptor.reader.ClassMetadataInterceptorReference

  • org.jboss.weld.interceptor.reader.DefaultMethodMetadata

  • org.jboss.weld.interceptor.reader.ReflectiveClassMetadata

  • org.jboss.weld.interceptor.reader.SimpleInterceptorMetadata

  • org.jboss.weld.interceptor.spi.instance.InterceptorInstantiator

  • org.jboss.weld.interceptor.spi.metadata.InterceptorReference

  • org.jboss.weld.interceptor.spi.metadata.MethodMetadata

  • org.jboss.weld.interceptor.spi.model.InterceptionModel

  • org.jboss.weld.interceptor.spi.model.InterceptionType

  • java.rmi.registry.Registry

  • java.rmi.server.ObjID

  • java.rmi.server.RemoteObjectInvocationHandler

  • java.lang.reflect.Proxy

  • org.python.core.PyObject

  • org.python.core.PyBytecode

  • org.python.core.PyFunction

  • org.mozilla.javascript.NativeJavaObject

  • org.mozilla.javascript.NativeJavaArray

  • org.apache.myfaces.context.servlet.FacesContextImpl

  • org.apache.myfaces.context.servlet.FacesContextImplBase

  • org.apache.myfaces.el.CompositeELResolver

  • org.apache.myfaces.el.unified.FacesELContext

  • org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression

  • com.sun.syndication.feed.impl.ObjectBean

  • org.springframework.beans.factory.ObjectFactory

  • org.springframework.aop.framework.AdvisedSupport

  • org.springframework.aop.framework.JdkDynamicAopProxy

  • org.springframework.aop.target.SingletonTargetSource

  • org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider

  • org.springframework.core.SerializableTypeWrapper$TypeProvider

  • com.vaadin.data.util.NestedMethodProperty

  • com.vaadin.data.util.PropertysetItem

  • org.apache.wicket.util.upload.DiskFileItem

  • org.apache.commons.configuration.ConfigurationMap

  • flex.messaging.io.amf.ActionMessage

  • flex.messaging.io.amf.MessageHeader

  • java.io.InputStream

  • java.nio.channels.Channel

  • javax.activation.DataSource

  • javax.sql.rowset.BaseRowSet

  • sun.reflect.**

  • sun.tracing.**

  • com.sun.corba.**

  • .*\.ws\.client\.sei\..*

  • .*\$ProxyLazyValue

  • com\.sun\.jndi\..*Enumerat(?:ion|or)

  • .*\$URLData

  • .*\.xsltc\.trax\.TemplatesImpl

  • (javax|sun.swing)\..*LazyValue

앱 링크에 OAuth 2.0을 사용하여 안전하게 연결

Atlassian Data Center 제품군 전반에 걸쳐 애플리케이션 링크 (앱 링크) 에 대한 OAuth 2.0 지원을 도입합니다.

OAuth 2.0은 Atlassian 제품과 외부 애플리케이션 간에 안전하고 최신이며 안정적인 연결을 가능하게 하는 업계 표준 인증 프로토콜입니다.

bookmark tabs Configuring an incoming link


또한 하이브리드 환경의 안전하고 효율적인 통합을 위해 클라우드와 연결하는 OAuth 2.0 기반 앱 링크 기능을 개발 중이며, 곧 일정을 공유할 예정입니다.

OAuth 2.0 2LO 를 사용하기 위한 REST 엔드포인트에 스코프 추가

REST 엔드포인트에 대한 보안 및 제어 기능을 향상시키기 위해 @ScopesAllowed 기능을 도입했습니다.

OAuth 2.0 클라이언트 자격 증명 토큰 (2LO) 을 사용하여 엔드포인트에 액세스할 수 있도록 하려면 엔드포인트에 @ScopesAllowed 어노테이션을 추가하세요.


예를 들어, 이 어노테이션은 해당 엔드포인트에 대한 접근 권한을 부여하기 전에 액세스 토큰에 쓰기 권한이 있어야 함을 요구합니다.

@POST
@ScopesAllowed(requiredScope = "WRITE")
public void createEntity(...) {}

OAuth 2.0 보안 개선 사항

보안 및 효율성 향상을 위해 OAuth 2.0 인증 프로세스에 몇 가지 중요한 변경 사항을 적용하고 있습니다. 


  • 액세스 토큰의 최대 유효 기간을 글로벌로 적용합니다. 
    이제 액세스 토큰의 최대 유효 기간은 1시간입니다. 이 변경 사항은 토큰 갱신 빈도를 높여 보안을 강화하기 위한 것입니다.
    시스템 속성 atlassian.oauth2.provider.access.token.expiration.seconds 을 설정하여 최대 유효 기간을 변경할 수 있습니다.
  • 클라이언트 ID 및 secret 의 최대 유효 기간 
    클라이언트 ID와 시크릿의 유효 기간의 기본값은 90일입니다. 하지만 이 설정을 최대 730일 까지 조정할 수 있습니다.
    이 변경 사항은 자격 증명을 정기적으로 교체하도록 권장하기 위한 것입니다. 시스템 속성 atlassian.oauth2.provider.client.credentials.expiration.seconds 을 설정하여 값을 변경할 수 있습니다.
  • 클라이언트 자격 증명 순환 
    보안 강화를 위해 클라이언트 ID와 비밀 키를 포함한 클라이언트 자격 증명을 정기적으로 순환하는 것이 권장됩니다. 순환 정책을 시행하면 자격 증명 유출과 관련된 위험을 완화하는 데 도움이 될 수 있습니다.
  • 클라이언트 자격 증명 교체 후 삭제 
    클라이언트 자격 증명 (클라이언트 ID 및 비밀 키) 이 교체되면 이전 자격 증명을 삭제해야 합니다. 이렇게 하면 최신 자격 증명만 활성화한 상태로 유지되어 무단 액세스 위험을 줄일 수 있습니다. 
  • 사용자 갱신 토큰 취소 
    특정 사용자와 연결된 모든 갱신 토큰을 취소할 수 있습니다. 또한 관리자는 시스템 내 모든 사용자의 갱신 토큰을 취소할 권한을 갖습니다.
    이 기능을 통해 세션 관리 및 보안을 더욱 효과적으로 제어할 수 있습니다.
  • 새로 고침 토큰 최대 개수 
    클라이언트 ID 및 사용자별로 허용되는 새로 고침 토큰의 최대 개수는 25개로 제한됩니다. 이 제한은 리소스 사용량을 관리하고 토큰 남용을 방지하는 데 도움이 됩니다.
    시스템 속성 atlassian.oauth2.provider.refresh.token.limit.per.client.user 을 설정하여 이 값을 변경할 수 있습니다.

앱 설치 시 앱 서명이 기본적으로 활성화됨

이번 릴리스에서는 앱 서명이 기본적으로 활성화되어 있습니다. 이 기능은 앱 보안을 강화하며, 데이터 센터 제품 전반에 걸쳐 점진적으로 도입되었습니다.

자세한 내용은 bookmark tabs 커뮤니티 게시물을 확인하세요.


앱 서명은 새로운 앱 설치에만 영향을 미치며, 이미 설치된 앱은 그대로 유지됩니다.

마켓플레이스에서 애플리케이션을 설치하는지, 아니면 사용자 지정 애플리케이션을 빌드하는지에 따라 수행해야 하는 단계가 달라집니다.

마켓플레이스에서 앱 설치하는 경우

  1. Configuring UPM app signature check 의 설명대로 truststore 디렉토리 위치를 설정 
  2. Atlassian Certificate 번들을 다운로드 및 설치
    자세한 사항은 Updating Atlassian Certificate Bundles 을 참고
  3. Marketplace에서 안전한 앱 설치

사용자 정의 앱을 설치하는 경우

  1. Configuring UPM app signature check 의 설명대로 truststore 디렉토리 위치를 설정
  2. Generating app signature and verification certificate using OpenSSL 의 설명에 따라 앱 서명과 인증서 받기
  3. Updating Atlassian Certificate Bundles 의 설명에 따라 Trust store에 새 인증서 추가
  4. 서명된 앱 설치

앱 서명 기능을 사용하지 않고도 파일 시스템을 통해 앱을 설치할 수 있습니다.

문제가 발생하면 app signing troubleshooting을 확인하세요.

SQL Server 용 jTDS 드라이버에서 Microsoft JDBC 드라이버로 전환

jTDS 드라이버 지원이 중단되었으며, 더 이상 Crowd 에 포함되어 있지 않습니다. Crowd는 이제 SQL Server 용 Microsoft JDBC 드라이버를 지원하여 SQL Server 데이터베이스와의 지속적인 호환성을 보장합니다.

jTDS 드라이버를 계속 사용하시려면 (warning 권장하지 않음) 또는 MS JDBC 드라이버로 전환하시려면 ((눈금) 권장함) 드라이버를 tomcat/lib 디렉터리에 수동으로 추가해야 합니다.

MS SQL Server 데이터베이스를 사용하여 Crowd 를 설정하는 방법은 다음 문서를 참고하세요. bookmark tabs MS SQL Server


기존 인스턴스를 Crowd 7.0 으로 업그레이드하는 경우 bookmark tabs JTSD에서 Microsoft 의 JDBC 드라이버로 전환 가이드를 참조하세요.

지원 플랫폼에 변경 사항

Crowd에서 지원하는 플랫폼에 변경 사항이 있습니다. Crowd의 최신 안정 버전에서 지원하는 기능에 대한 자세한 내용은 다음을 참조하세요. bookmark tabs Supported Platforms

  • Oracle 21ai 지원을 추가하고 번들로 제공되던 Oracle JDBC 드라이버를 제거했습니다.
    • 기존에 지원하던 Oracle 19 버정 외에도 이제 Oracle 23ai 데이터베이스를 지원합니다. 이러한 데이터베이스는 서로 다른 Oracle JDBC 드라이버를 필요로 하므로,
      기본 제공되는 드라이버에서 Oracle JDBC 드라이버를 제거했습니다.
      Oracle 데이터베이스 버전 (Oracle 23ai 또는 Oracle 19) 에 따라 적절한 Oracle JDBC 드라이버 파일을 tomcat/lib 디렉터리에 추가해야 합니다.

지원 추가

다음 기능에 대한 지원이 추가되었습니다.

  • PostgreSQL 17

  • MySQL 8.4

지원 중단

다음 기능에 대한 지원이 제거되었습니다.

  • Java 17

  • Oracle 12

  • Postgres 10

  • Postgres 11

  • Postgres 12

  • Postgres 13

  • Postgres 14

  • MySQL 5.7

  • MySQL 8.0 LTS

  • SQL Server 2016

  • SQL Server 2017

해결된 문제



참조 링크