JWT 인증
개요
JWT (JSON 웹 토큰) 인증은 기존의 커스텀 인증과는 다릅니다.
JWT 인증을 사용하려면 클라이언트가 특별한 토큰을 전달해야 합니다.
Photon 서버는 외부 웹 서비스를 호출하지 않고, 단순히 해당 토큰을 검증합니다.
토큰은 JWT 형식을 사용하며 보안상의 이유로 암호화됩니다.
대시보드 설정
JWT를 인증 제공자로 추가하는 것은 간단하며, Photon 애플리케이션 관리 화면에서 몇 초 만에 설정할 수 있습니다.
애플리케이션의 "Manage" 페이지로 이동한 후, "Authentication" 섹션을 아래로 스크롤 하세요.
JWT용 신규 인증 제공자를 추가하거나 기존 제공자를 편집할 경우 필수 설정은 다음과 같습니다:
- secret1, 필수 값
<KeyHash>;<KeyEncryption>;<KeySignature>. 항상 "secret1"을 설정해야 합니다. - secret2, 선택 값
<KeyHash2>;<KeyEncryption2>;<KeySignature2>.
"secret2"는 키를 변경해야 할 때 사용할 수 있습니다.
대시보드의 변경 사항이 모든 서버에 적용되기까지 시간이 걸리므로, "secret2"에는 이전 값을, "secret1"에는 새로운 값을 입력하면 됩니다.
이렇게 하면 미리 안전하게 조정할 수 있습니다.
예시 Secret
secret1:
00000000-0000-0000-0000-000000000001;00000000-0000-0000-0000-000000000002;00000000-0000-0000-0000-000000000003
구성 요소는 다음과 같습니다:
- Key Hash:
00000000-0000-0000-0000-000000000001 - Key Encryption:
00000000-0000-0000-0000-000000000002 - Key Signature:
00000000-0000-0000-0000-000000000003
참고: 단순화를 위해 GUID를 사용했지만, 다른 문자열을 선택할 수도 있습니다.
토큰 생성
토큰 생성에는 여러 라이브러리를 사용할 수 있습니다 (예: C#의 System.IdentityModel.Tokens.Jwt).
암호화 구현 예시는 제공된 테스트 콘솔 애플리케이션의 소스를 참조할 수 있습니다.
토큰 형식: <base64UrlEncode(header)>.<base64UrlEncode(payload)>.<Signature>
Header
JSON
{
"alg": "HS256",
"typ": "JWT"
}
Payload
JSON
{
// jwt
"exp" : [timestamp], // 만료 시간
"iat" : [timestamp], // 발급 시각 (선택)
"nbf" : [timestamp], // 사용 가능 시점 (선택)
// Photon
"UserId" : [string:value, optional],
"Nickname" : [string:value, optional],
"AuthCookie" : [Dictionary<string, object>, optional]
}
Signature
MACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
[secret]
)
예시
JSON:
JSON
{
"alg":"HS256",
"typ":"JWT"
}
.
{
"UserId":"Jason2000",
"Nickname":"Jason",
"nbf":1519314827,
"exp":1519318427,
"iat":1519314827
}
서명 및 인코딩 (secret "00000000-0000-0000-0000-000000000003" 사용):
text
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJKYXNvbjIwMDAiLCJOaWNrbmFtZSI6Ikphc29uIiwibmJmIjoxNTE5MzE0ODI3LCJleHAiOjE1MTkzMTg0MjcsImlhdCI6MTUxOTMxNDgyN30.B2gs4_qEBbwXsjOvW8ZbORiBxLrcmsE96P77Kzyaf2c
생성된 토큰은 JWT debugger에서 테스트할 수 있습니다.
"Encoded" 필드에 붙여 넣고, 서명을 검증하려면 "secret" 필드에 00000000-0000-0000-0000-000000000003 값을 입력하세요.
암호화
사용되는 암호화 방식에 대한 세부사항은 다음과 같습니다:
- 형식:
[IV][encrypted data][HMAC] - 암호화 알고리즘: AES
- IV 크기: 16
- 패딩: PKCS7 (
System.Security.Cryptography기본값) - 블록 크기: 16
- HMAC 크기: 32
- 해시 알고리즘: SHA256
- 해시 및 암호화 키: 대시보드 문자열 값을 UTF-8 바이트 배열로 변환 후 SHA256 해시
클라이언트 코드
클라이언트는 생성된 JWT 토큰 문자열을 암호화, URL 인코딩, Base64 포맷으로 전송해야 합니다:
C#
PhotonNetwork.AuthValues = new AuthenticationValues();
authValues.AuthType = CustomAuthenticationType.Jwt; // 9
authValues.SetAuthPostData(jwtTokenString);
// do not set AuthValues.Token or authentication will fail
// connect
Back to top