CHashtag

[C#] JWT 암호화, 복호화 예제 본문

C#

[C#] JWT 암호화, 복호화 예제

HyoSeong 2023. 2. 20. 22:36
반응형

안녕하세요.

 

JWT란?

JWT는 인증과 정보 교환을 위한 안전한 방법을 제공하는 토큰 기반의 개방형 표준입니다. JWT는 세 부분으로 구성되어 있습니다. 헤더(header), 내용(payload), 서명(signature)으로 이루어져 있으며 각각은 Base64Url로 인코딩되어 하나의 문자열로 만들어져 전송됩니다.

  • Header : JWT의 타입과 사용하는 해시 알고리즘 등의 정보를 포함합니다.
  • Payload : 토큰에 포함할 클레임(Claim) 정보를 담습니다. 클레임이란 사용자 정보, 권한 정보 등을 의미합니다.
  • Signature : 헤더와 페이로드, 비밀키를 조합하여 생성된 서명값으로, 토큰의 변조 여부를 검증합니다.

 

JWT 암호화하기

C#에서 JWT를 암호화하는 방법은 다음과 같습니다.

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

// 토큰 발급
public string IssueJwtToken(string userId, string userRole, string secretKey)
{
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
    var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

    var claims = new[]
    {
        new Claim(ClaimTypes.NameIdentifier, userId),
        new Claim(ClaimTypes.Role, userRole)
    };

    var token = new JwtSecurityToken(
        issuer: "yourdomain.com",
        audience: "yourdomain.com",
        claims: claims,
        expires: DateTime.Now.AddHours(1),
        signingCredentials: signingCredentials);

    return new JwtSecurityTokenHandler().WriteToken(token);
}

 

위 코드에서 secretKey는 서버에서 사용하는 암호화 키입니다. 

signingCredentials 객체는 JWT에 서명하기 위한 보안 자격 증명입니다. 

claims는 JWT에 담길 클레임(claim) 정보입니다. issuer와 audience는 JWT의 발급자와 대상자 정보입니다.

 

JWT 복호화하기

JWT를 복호화하기 위해서는 토큰 검증을 수행해야 합니다. 

검증은 서명된 토큰의 유효성을 검사하는 것입니다. 

C#에서 JWT를 검증하는 방법은 다음과 같습니다.

 

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;

// 토큰 검증
public ClaimsPrincipal ValidateJwtToken(string jwtToken, string secretKey)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var validationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey)),
        ValidateIssuer = true,
        ValidIssuer = "yourdomain.com",
        ValidateAudience = true,
        ValidAudience = "yourdomain.com",
        ValidateLifetime = true,
        ClockSkew = TimeSpan.Zero
    };

    try
    {
        SecurityToken validatedToken;
        return tokenHandler.ValidateToken(jwtToken, validationParameters, out validatedToken);
    }
    catch (SecurityTokenException)
    {
        return null;
    }
}

위 코드에서 jwtToken은 검증할 JWT 토큰입니다. 

ValidateToken 메서드는 JWT 토큰을 검증하고, ClaimsPrincipal 객체를 반환합니다. 

반환된 ClaimsPrincipal 객체에서는 Identity 속성으로 인증된 사용자의 정보를 가져올 수 있습니다.

 

감사합니다.

 

*chatGPT가 작성한 게시글입니다.

반응형