IdentityServer4로 인증 서버 구축하기 🔐
안녕하세요, 여러분! 오늘은 정말 핫한 주제로 찾아왔어요. 바로 IdentityServer4를 사용해서 인증 서버를 구축하는 방법에 대해 알아볼 거예요. 이거 완전 꿀팁이에요! 😎
요즘 개발자들 사이에서 인증과 보안이 얼마나 중요한지 아시죠? 그래서 오늘은 여러분의 애플리케이션을 더욱 안전하고 믿음직스럽게 만들어줄 IdentityServer4에 대해 깊이 파고들어볼 거예요. 재능넷 같은 플랫폼을 운영하시는 분들에게도 완전 유용한 정보가 될 거예요!
💡 Pro Tip: IdentityServer4는 단순한 인증 서버가 아니라, 여러분의 애플리케이션에 보안의 날개를 달아주는 슈퍼 히어로 같은 존재예요!
자, 이제 본격적으로 시작해볼까요? 준비되셨나요? 그럼 출발~! 🚀
IdentityServer4란 뭐야? 🤔
IdentityServer4는 .NET Core를 위한 OpenID Connect와 OAuth 2.0 프레임워크예요. 어머나, 너무 어려운 용어들이 나왔죠? 걱정 마세요! 쉽게 설명해드릴게요. ㅋㅋㅋ
IdentityServer4는 여러분의 애플리케이션에 보안 문지기 역할을 해주는 녀석이에요.
마치 클럽의 문지기처럼 "너 들어와도 돼, 넌 안 돼!" 하는 거죠. 😎이 녀석이 하는 일을 좀 더 자세히 알아볼까요?
- 사용자 인증 (Authentication): "너 누구야?" 를 확인해주는 거예요.
- 권한 부여 (Authorization): "너 여기 들어와도 돼?" 를 결정해주는 거고요.
- 싱글 사인온 (Single Sign-On): 한 번 로그인하면 여러 서비스를 돌아다닐 수 있게 해주는 거예요. 완전 편하죠?
- API 보안: API를 안전하게 보호해주는 역할도 해요.
와~ 정말 많은 일을 하는 녀석이죠? IdentityServer4는 마치 재능넷에서 다양한 재능을 한 곳에서 관리하는 것처럼, 여러분의 애플리케이션의 보안을 한 곳에서 관리할 수 있게 해줘요. 완전 꿀이죠? 🍯
🎭 재미있는 비유: IdentityServer4를 영화관의 티켓 부스라고 생각해보세요. 티켓(토큰)을 발급해주고, 그 티켓으로 어떤 영화(리소스)를 볼 수 있는지 결정해주는 거예요!
자, 이제 IdentityServer4가 뭔지 대충 감이 오시나요? 그럼 이제 이 녀석을 어떻게 우리 프로젝트에 도입할 수 있는지 알아볼까요? 준비되셨나요? 다음 섹션으로 고고! 🏃♂️💨
IdentityServer4 설치하기 🛠️
자, 이제 본격적으로 IdentityServer4를 우리 프로젝트에 설치해볼 거예요. 긴장되나요? 걱정 마세요! 제가 step by step으로 가이드 해드릴게요. 마치 레고 블록 조립하듯이 쉽게 할 수 있어요! 👷♂️
1. 새 프로젝트 만들기
먼저, Visual Studio를 열고 새 프로젝트를 만들어볼까요?
- Visual Studio 실행 (없다면 지금 당장 설치하러 가세요! ㅋㅋ)
- "새 프로젝트 만들기" 클릭
- "ASP.NET Core 웹 애플리케이션" 선택
- 프로젝트 이름을 정해주세요. (예: "MyAwesomeAuthServer")
- .NET Core 3.1 이상 선택 (최신 버전 쓰는 게 좋아요!)
와~ 벌써 프로젝트가 만들어졌어요! 여러분 정말 대단해요! 👏
2. NuGet 패키지 설치
이제 IdentityServer4를 설치할 차례예요. NuGet 패키지 관리자를 사용할 거예요.
- 솔루션 탐색기에서 프로젝트 우클릭
- "NuGet 패키지 관리" 선택
- 검색창에 "IdentityServer4" 입력
- "IdentityServer4" 패키지 찾아서 설치 (버전은 최신으로!)
축하드려요! 이제 IdentityServer4가 여러분의 프로젝트에 설치되었어요. 완전 쉽죠? 😎
💡 꿀팁: 패키지 버전은 항상 최신 버전을 사용하는 게 좋아요. 하지만 주의할 점! 메이저 버전 업그레이드 시에는 변경 사항을 꼭 확인하세요.
3. 설정 파일 수정하기
이제 우리의 프로젝트가 IdentityServer4를 사용할 수 있도록 설정 파일을 수정해볼 거예요.
Startup.cs 파일을 열고 다음과 같이 수정해주세요:
using IdentityServer4.Models;
using IdentityServer4.Test;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
.AddInMemoryClients(new List<client>())
.AddInMemoryIdentityResources(new List<identityresource>())
.AddInMemoryApiResources(new List<apiresource>())
.AddInMemoryApiScopes(new List<apiscope>())
.AddTestUsers(new List<testuser>())
.AddDeveloperSigningCredential();
}
public void Configure(IApplicationBuilder app)
{
app.UseIdentityServer();
}
}
</testuser></apiscope></apiresource></identityresource></client>
우와~ 이제 기본적인 설정이 완료되었어요! 여러분 정말 대단해요! 👍
이 코드가 뭘 하는 건지 궁금하시죠? 간단히 설명해드릴게요:
AddIdentityServer()
: IdentityServer4를 서비스에 추가해요.AddInMemoryClients()
: 클라이언트 정보를 메모리에 저장해요. (나중에 실제 데이터로 바꿀 거예요!)AddInMemoryIdentityResources()
: 사용자 정보 리소스를 정의해요.AddInMemoryApiResources()
: API 리소스를 정의해요.AddInMemoryApiScopes()
: API 스코프를 정의해요.AddTestUsers()
: 테스트용 사용자를 추가해요.AddDeveloperSigningCredential()
: 개발 환경에서 사용할 임시 서명 키를 생성해요.
그리고 Configure
메서드에서 app.UseIdentityServer()
를 호출해서 IdentityServer 미들웨어를 파이프라인에 추가했어요.
어때요? 생각보다 별거 아니죠? ㅋㅋㅋ
자, 이제 기본적인 설치와 설정이 끝났어요. 여러분 정말 잘하셨어요! 👏👏👏
다음 섹션에서는 이 설정을 좀 더 실전에 가깝게 만들어볼 거예요. 재능넷 같은 실제 서비스에 적용할 수 있도록 말이죠. 기대되지 않나요? 저는 정말 신나요! 🎉
잠깐 쉬었다가 다음 섹션으로 넘어갈까요? 커피 한 잔 하고 오세요! ☕ 곧 돌아올게요~
IdentityServer4 설정 심화 과정 🧠
자, 이제 좀 더 깊이 들어가볼 시간이에요! 커피 마시고 오셨나요? 준비되셨죠? 그럼 시작해볼까요? 😎
1. 클라이언트 설정하기
먼저, 우리의 인증 서버를 사용할 클라이언트를 설정해볼 거예요. 클라이언트란 뭘까요? 간단히 말해서, 우리의 인증 서버를 이용해 인증을 받을 애플리케이션이에요. 재능넷 같은 웹사이트가 클라이언트가 될 수 있겠죠?
Startup.cs 파일에 다음과 같이 클라이언트를 추가해볼게요:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
.AddInMemoryClients(new List<client>
{
new Client
{
ClientId = "재능넷",
ClientName = "재능넷 웹사이트",
AllowedGrantTypes = GrantTypes.Code,
RequireClientSecret = false,
RequirePkce = true,
RedirectUris = { "https://www.jaenung.net/signin-oidc" },
PostLogoutRedirectUris = { "https://www.jaenung.net/signout-callback-oidc" },
AllowedScopes = { "openid", "profile", "email" }
}
})
// ... 나머지 설정은 그대로 유지
}
</client>
우와~ 뭔가 복잡해 보이죠? 하나씩 설명해드릴게요! 😊
ClientId
: 클라이언트의 고유 식별자예요. 여기서는 "재능넷"으로 설정했어요.ClientName
: 클라이언트의 이름이에요. 사용자에게 보여질 수 있어요.AllowedGrantTypes
: 인증 방식을 설정해요. 여기서는 Authorization Code 방식을 사용했어요.RequireClientSecret
: 클라이언트 시크릿을 요구할지 설정해요. 여기서는 false로 설정했어요.RequirePkce
: PKCE(Proof Key for Code Exchange)를 사용할지 설정해요. 보안을 강화하기 위해 true로 설정했어요.RedirectUris
: 인증 후 리다이렉트될 URL을 설정해요.PostLogoutRedirectUris
: 로그아웃 후 리다이렉트될 URL을 설정해요.AllowedScopes
: 이 클라이언트가 요청할 수 있는 스코프를 설정해요.
이렇게 설정하면 재능넷 웹사이트가 우리의 IdentityServer4를 통해 사용자 인증을 할 수 있게 돼요!
🎭 재미있는 비유: 클라이언트 설정은 마치 클럽에 VIP 명단을 등록하는 것과 같아요. 이 명단에 있는 애플리케이션만 우리의 인증 서버를 이용할 수 있어요!
2. 리소스 설정하기
다음으로, 우리가 보호하고 싶은 리소스를 설정해볼 거예요. 리소스는 크게 두 가지로 나눌 수 있어요:
- Identity Resources: 사용자 정보와 관련된 리소스예요.
- API Resources: API와 관련된 리소스예요.
먼저 Identity Resources부터 설정해볼까요?
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
// ... 클라이언트 설정은 그대로 유지
.AddInMemoryIdentityResources(new List<identityresource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile(),
new IdentityResources.Email(),
new IdentityResource
{
Name = "role",
UserClaims = new List<string> {"role"}
}
})
// ... 나머지 설정은 그대로 유지
}
</string></identityresource>
여기서 우리는 OpenID, Profile, Email, 그리고 사용자 정의 role 리소스를 추가했어요. 이렇게 하면 클라이언트가 이 정보들을 요청할 수 있게 돼요.
이제 API Resources를 설정해볼까요?
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
// ... 앞서 설정한 부분은 그대로 유지
.AddInMemoryApiResources(new List<apiresource>
{
new ApiResource("재능넷API", "재능넷 API")
{
Scopes = { "재능넷API.full_access", "재능넷API.read_only" }
}
})
.AddInMemoryApiScopes(new List<apiscope>
{
new ApiScope("재능넷API.full_access"),
new ApiScope("재능넷API.read_only")
})
// ... 나머지 설정은 그대로 유지
}
</apiscope></apiresource>
여기서 우리는 "재능넷API"라는 API 리소스를 추가했어요. 그리고 이 API에 대한 두 가지 스코프(full_access와 read_only)를 정의했죠.
이렇게 하면 클라이언트가 재능넷 API에 접근할 때 필요한 권한을 세밀하게 제어할 수 있어요!
3. 테스트 사용자 추가하기
마지막으로, 테스트를 위한 사용자를 추가해볼게요. 실제 서비스에서는 데이터베이스에서 사용자 정보를 가져오겠지만, 지금은 간단히 메모리에 테스트 사용자를 추가할 거예요.
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
// ... 앞서 설정한 부분은 그대로 유지
.AddTestUsers(new List<testuser>
{
new TestUser
{
SubjectId = "1",
Username = "alice",
Password = "alice123",
Claims = new List<claim>
{
new Claim("name", "Alice"),
new Claim("email", "alice@재능넷.com"),
new Claim("role", "재능판매자")
}
},
new TestUser
{
SubjectId = "2",
Username = "bob",
Password = "bob123",
Claims = new List<claim>
{
new Claim("name", "Bob"),
new Claim("email", "bob@재능넷.com"),
new Claim("role", "재능구매자")
}
}
});
}
</claim></claim></testuser>
여기서 우리는 Alice와 Bob이라는 두 명의 테스트 사용자를 추가했어요. 각 사용자에게는 이름, 이메일, 역할 등의 정보를 Claims로 추가했죠.
⚠️ 주의: 실제 서비스에서는 절대로 이렇게 하드코딩된 사용자 정보를 사용하면 안 돼요! 이건 오직 테스트 목적으로만 사용해야 해요.
자, 이제 우리의 IdentityServer4 설정이 거의 완성되었어요! 여러분 정말 대단해요! 👏👏👏
이 그림은 우리가 지금까지 설정한 IdentityServer4의 주요 구성 요소를 보여줘요. 클라이언트, 리소스, 사용자가 모두 IdentityServer4를 중심으로 연결되어 있죠?
다음 섹션에서는 이렇게 설정한 IdentityServer4를 실제로 실행하고 테스트해볼 거예요. 기대되지 않나요? 저는 정말 신나요! 🎉
잠깐 쉬었다가 다음 섹션으로 넘어갈까요? 이번엔 간식도 좀 먹고 오세요! 🍪 곧 돌아올게요~
IdentityServer4 실행 및 테스트하기 🚀
자, 이제 우리가 설정한 IdentityServer4를 실제로 실행하고 테스트해볼 시간이에요! 간식은 맛있게 드셨나요? 그럼 시작해볼까요? 😎
1. 프로젝트 실행하기
먼저, Visual Studio에서 우리 프로젝트를 실행해볼게요. F5 키를 누르거나 상단 메뉴의 "디버그 > 시작" 을 클릭하세요.
프로젝트가 실행되면 브라우저가 자동으로 열릴 거예요. 주소창을 확인해보세요. 아마 https://localhost:5001
같은 주소일 거예요.
💡 꿀팁: 포트 번호는 다를 수 있어요. 여러분의 환경 설정에 따라 달라질 수 있거든요. 걱정하지 마세요!
2. Discovery 엔드포인트 확인하기
IdentityServer4가 제대로 실행되었는지 확인하는 가장 쉬운 방법은 Discovery 엔드포인트를 확인하는 거예요. 브라우저 주소창에 다음 주소를 입력해보세 요:
https://localhost:5001/.well-known/openid-configuration
이 주소로 접속하면 JSON 형식의 데이터가 보일 거예요. 이 데이터에는 우리의 IdentityServer4에 대한 중요한 정보들이 들어있어요.
만약 이 페이지가 잘 보인다면, 축하드려요! 🎉 우리의 IdentityServer4가 제대로 실행된 거예요!
3. 토큰 요청 테스트하기
이제 실제로 토큰을 요청해볼 거예요. 이를 위해 우리는 Postman이라는 도구를 사용할 거예요. Postman이 없다면 지금 바로 설치해주세요!
- Postman을 실행하고 새로운 요청을 만드세요.
- HTTP 메소드를 POST로 설정하세요.
- URL을
https://localhost:5001/connect/token
로 설정하세요. - "Body" 탭을 선택하고 "x-www-form-urlencoded"를 선택하세요.
- 다음 키-값 쌍을 추가하세요:
- client_id: 재능넷
- grant_type: password
- username: alice
- password: alice123
- scope: openid profile email 재능넷API.read_only
- "Send" 버튼을 클릭하세요.
만약 모든 것이 제대로 설정되었다면, 서버로부터 access_token을 포함한 응답을 받을 수 있을 거예요!
🎭 재미있는 비유: 이 과정은 마치 클럽에서 VIP 팔찌를 받는 것과 같아요. 이 토큰(팔찌)이 있으면 특정 API(VIP 구역)에 접근할 수 있게 되는 거죠!
4. 토큰 검증하기
받은 토큰이 유효한지 확인해볼까요? JWT.io 웹사이트를 사용할 거예요.
- 브라우저에서 https://jwt.io/에 접속하세요.
- Postman에서 받은 access_token을 복사해서 JWT.io의 "Encoded" 칸에 붙여넣으세요.
- "Decoded" 칸에서 토큰의 내용을 확인할 수 있어요.
여기서 우리가 설정한 클레임들(이름, 이메일, 역할 등)을 확인할 수 있어요.
이렇게 해서 우리는 IdentityServer4를 성공적으로 설정하고, 실행하고, 테스트까지 해봤어요! 정말 대단해요! 👏👏👏
이 그림은 우리가 방금 테스트한 토큰 발급 과정을 보여줘요. 클라이언트가 IdentityServer4에 토큰을 요청하고, 받은 토큰으로 리소스 서버와 안전하게 통신할 수 있게 되는 거죠.
마무리
여기까지 오신 여러분, 정말 대단해요! 우리는 IdentityServer4를 설치하고, 설정하고, 실행하고, 테스트까지 해봤어요. 이제 여러분은 강력한 인증 서버를 구축할 수 있는 능력을 갖추게 된 거예요!
이 지식을 바탕으로 재능넷 같은 실제 서비스에 적용해볼 수 있을 거예요. 사용자 인증, API 보안, 싱글 사인온 등 다양한 보안 기능을 구현할 수 있죠.
앞으로도 계속 공부하고 발전해 나가세요. 보안은 끊임없이 변화하는 분야니까요. 여러분의 앞날을 응원합니다! 화이팅! 💪😊