ㆍ앞에서 살펴본 Middleware , Attribute 를 사용하는 웹API 은 인증 방식과 더불어, Base Authenticaion 또한 요청헤더에 정보를 보내고, 서버로 부터 Authorization 을 받는 매커니즘은 거의 같다. 아니 아예같다. (middleware 로도 서비스 할 수 있고 attribute 로도 가능하다. – 용도에 따라 다르게 구현하자) 단, 아래와 같이 몇가지 규격을 갖는다면, ① http에 추가되는 헤더명은 “Authorization” 으로 할것 ② 인코딩 맨앞 문자열에 “Basic” 문자열을 포함할것. ③ Authorization 키의 값은 “아이디:패스워드” 포맷으로 Base64 인코딩할것 , 정리하면 아래와 같다 Autorization : Basic dGVzdDoxMjM0 (Basic 과 값 사이에 띄어쓰기) |
코드로 구현해보면, string UserInfo = string.concat(userid , “:” , password); byte [] UserInfoBytes = Encoding.UTF8.GetBytes(UserInfo); string UserInfoBase64 = Convert.ToBase64String(UserInfoBytes ); http.DefaultRequestHeaders.Add(“Authorization”, string.Concat(“Basic” , ” ” , userIdBase64, “:” , passwordBase64);
// base64 문자열 복원 byte [] decodeInfoBytes= System.Convert.FromBase64String(UserInfoBase64 ); string decodeInfoString = System.Text.Encoding.Default.GetString(decodeInfoBytes); Base64 로 인코딩을 하더라도, 쉽게 디코딩이 되기때문에, https 보안채널을 이용하도록 한다. https 채널을 이용한다 하더라도 보안이 완전하지 않으며, 사용 환경을 보고 적절히, 이 인증방식을 사용하여야 한다. (좀더 암호화를 복잡하고 하고자하면 salt 값을 이용하기도 하자) [Middelware로 구현하는 Base Authentication] public async Task InvokeAsync(HttpContext context) { // http 헤더 키가 “Authorization” 의 값 가져오기 string authUserInfo = context.Request.Headers[“Authorization”]; // Basic 대소문자 구분함 if (authUserInfo != null && authUserInfo.StartsWith(“Basic”)) { // 값의 Basic 뒤의 ID:password 값을 가져온다. string userInfoBase64 = authUserInfo.Substring(“Basic”.Length).Trim(); // Base64 문자열을 디코딩하여 bytes로 리턴 // Convert.FromBase64String(s) base64로 된 문자열 s 를 인자로 받아, 디코딩된 문자열의 값을 bytes 로 리턴 byte[] userInfoBytes = Convert.FromBase64String(userInfoBase64); // bytes 로 디코딩된 문자열(문자별 코드값) 을 string 형으로 변환 string userInfo = System.Text.Encoding.UTF8.GetString(userInfoBytes); // 구분값으르로 : userid 와 password 분리 string [] userInfoArray = userInfo.Split(‘:’); string userId = userInfoArray[0]; string userPassword = userInfoArray[1]; if(userId == “test” && userPassword == “1234”) { await this._next(context); } else { await context.Response.WriteAsync(“403. Basic Authentication error”); return; } } else { await context.Response.WriteAsync(“Basic Authentication userinfo is null or Empty”); return; } } [ Client ] – header 추가 Autorization : Basic dGVzdDoxMjM0 Key : Authoriztion value : Baise [id and password base64values] // dGVzdDoxMjM0 (test:1234) |