.Net JWT

닷넷디벨·2023년 2월 9일
0
post-custom-banner

개념

출처
https://velopert.com/2389
https://blog.outsider.ne.kr/1160
jwt.io

header.payload.signature
머리, 몸통, 꼬리로 구성되어 있습니다. 각각의 구성요소는 .으로 구분합니다

typ = 토큰 타입 지정
alg = HS256
이 정보를 Base64로 인코딩을 함.

PayLoad

정보를 담는 key, value 한쌍을 클레임이라 부름. 여러개의 클레임이 들어갈수 있음. 클래임은 3가지 타입으로 나눌수 있습니다.
등록된 (registered) 클레임,
공개 (public) 클레임,
비공개 (private) 클레임

Payload 등록된(registered) 클레임.
iss: 토큰 발급자 (issuer)
sub: 토큰 제목 (subject)
aud: 토큰 대상자 (audience)
exp: 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되어있어야 하며 (예: 1480849147370) 언제나 현재 시간보다 이후로 설정되어있어야합니다.
nbf: Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.
iat: 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 age 가 얼마나 되었는지 판단 할 수 있습니다.
jti: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.

Payload 공개(Public) 클레임
충돌 방지 이름을 써야 함.
"https://velopert.com/jwt_claims/is_admin": true
URL 형태로 네이밍을 해줍니다.

Payload 비공개(Private) 클레임

클라이언트 <-> 서버간에 합의된 이름을 사용함.
"username": "velopert"
{
"iss": "velopert.com",
"exp": "1485270000000",
"https://velopert.com/jwt_claims/is_admin": true,
"userId": "11028373727102",
"username": "velopert"
}
위 데이터를 base64로 변경함.

Signature

헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성합니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

설정

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = false,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "10x10.co.kr",
            ValidAudience = "10x10.co.kr",
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes(jwtSecurityKey))
        };
    });
public IActionResult Post()
{
    var jwtSecurityKey = _configuration.GetValue<string>("JWT:SecritKey");
    var claims = new List<Claim>() {new Claim(ClaimTypes.Name, "name")};
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecurityKey));
    var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    var token = new JwtSecurityToken(
        claims: claims,
        signingCredentials: credentials,
        issuer: "10x10.co.kr",
        audience: "10x10.co.kr"
        );
    return Ok(new
    {
        token = new JwtSecurityTokenHandler().WriteToken(token)
    });
}
profile
hardcore developer
post-custom-banner

0개의 댓글