숨기고 싶은 내 마음

니가 모르는 문자로


 오늘은 단방향 암호화 기법 Hash에 대해 글을 써보겠습니다.

 

쇼핑몰 사이트에서 API를 이용해서 이것저것 정보를 가져올 때, 이 쇼핑몰에서는 당연하게도 제가 요청한 내용과 저를 증명할 수 있는 방법을 요구하는데요. 이 쇼핑몰에서는 SHA-256 알고리즘(SHA는 Secure Hash Algorithm의 줄임말)을 이용해서 암호화를 하길래 NodeJS 모듈인 Crypto를 이용해서  Hash값과 HMAC값을 만들었습니다.

 

 여기서 잠깐, Hash는 뭐고 HMAC이 무엇인지 간단하게 설명하고 갈게요.

 

※ Hash(해시)

 단방향 암호화 기법 중 하나인 해쉬 알고리즘을 이용해서 일정한 길이의 암호화된 문자열을 생성하는 일을 Hashing이라고 하고, 그 Hashing 이후의 값을 Hash 값, Hash 값을 만들어내는 함수를 Hash 함수라고 합니다. Hash라고 하면 대략 Hash 알고리즘을 이용한 암호화라고 이해하면 될거 같아요.

 

※ HMAC(Hash based Message Authentication Code)

 HMAC에서 MAC는 메세지를 주는 사람과 받는 사람 사이에 그 메세지가 변형되지는 않았는지 확인하는 방법(변조 여부)으로 앞에 "H"가 붙으면 Hash 알고리즘을 이용한다는 뜻입니다. 

 

 Hash 함수 안에는 여러 가지 알고리즘이 있는데 요즘은 제가 쓰고 싶은 API는 SHA-256 방식의 알고리즘을 이용하라고 하니 그대로 적용해보겠습니다.


▷ Hash 값

1. 모듈을 import 해줍니다.

import crypto from "crypto"

 

2. 암호화 해주고 싶은 base_str을 다음처럼 암호화합니다.

const base_str = "this_is_base_string"

const result = crypto.createHash('sha256').update(base_str).digest('hex')

 여기서 결과값은 result에 담기게 됩니다.

 

 내용을 대략적으로 설명해보자면 다음과 같습니다.

 

 crypto 모듈을 이용해서 SHA-256 알고리즘('sha256')으로 해시 함수인 ceateHash를 통해 암호화를 한다. 암호화할 문자열은 base_str이고, 결과값을 hex 방식으로 표현한다.

 

 여기서 digest에 hex라는 말은 표현 방식인데, 가능한 표현방식으로는 'binary', 'hex', 'base64'가 있습니다. 'binary'는 2진수, 'hex'는 16진수, 'base64'는 64진수를 나타는데, 제가 쓸 API는 'hex' 방식을 요구하니까 'hex'를 사용합니다.


▷ HMAC 값

1. hash와 같습니다.

import crypto from "crypto"

 

2. 여기서는 암호화에 필요한 임의의 문자열(Secret Key)이 필요합니다.

const base_str = "this_is_base_string"

const secret_key = "thisIsSecretKeyPleaseDoNotOpenItToOtherPerson"

const result = crypto.createHmac('sha256', secret_key).update(base_str).digest('hex')

 

 crypto 모듈을 이용해서 SHA-256 알고리즘('sha256')으로 createHmac 함수를 통해 secret_key를 이용해서 암호화를 한다. 암호화할 문자열은 base_str이고, 결과값을 hex 방식으로 표현한다.

 

 여기서 secret_key는 공개되면 해커가 제 쇼핑몰을 다 망쳐놓을 수 있으니 절대 노출되어서는 안됩니다.

 

 그리고 이 secret_key는 저와 쇼핑몰 서버만 알고 있고 이를 통해서 제가 요청한 API가 안전한지, 변조되지는 않았는지 확인하는 작업을 거치게 되며 이런 방식으로 API 요청에 반응하게 됩니다.

 

  항상 느끼는 것이지만 이해하려고 하면 어렵지만 사용하기는 쉽군요.


역시 프로그래머들은 멋있어
이 글은 API가 무엇인지를 잘 모르는 분들을 위해 이해를 목적으로 쓰였습니다.

 

내놔, 그 데이터.


 프로그래밍을 하다 보면 API란 단어를 참 많이 듣게 됩니다. 먼저 위키백과에서 뭐라고 정의하는지를 살펴볼게요.

 

API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다.

 

 네, 저도 무슨 말인지 잘 모르겠으니까 어떻게 사용되고 있는지를 보면서 정의를 느낌으로 이해해보는 방향으로 설명해볼게요.

 

 먼저 쉽게 이해할 수 있는 API 하나를 살펴볼게요. 날씨입니다.

https://openweathermap.org/

 

Current weather data - OpenWeatherMap

Access current weather data for any location on Earth including over 200,000 cities! Current weather is frequently updated based on global models and data from more than 40,000 weather stations. Data is available in JSON, XML, or HTML format. We provide 40

openweathermap.org

 위 웹사이트는 API를 오픈해서 세계 날씨를 확인할 수 있는 곳입니다. 현재 날씨가 어떤지, 그동안 어땠었는지 알 수 있는데 어떻게 알 수 있는지는 아래와 같습니다.

api.openweathermap.org/data/2.5/weather?q={city name}&appid={your api key}

 

 위의 주소를 URL로 입력하면 날씨에 대한 데이터를 주는 방식입니다. 주소 내용 중에 {city name}에는 London 또는 Seoul 같은 도시의 이름이 들어가고 {your api key}에는 회원가입을 하면 무료로 주는 랜덤 문자열인 key값이 있습니다. 만약 현재 서울의 날씨를 확인하고 싶고 나의 app key가 "deOxndvhO201sAW" (임의로 대충 쳐봤습니다. 해봐도 소용없어요.)라고 한다면 주소가 아래 형식이 되겠죠?

api.openweathermap.org/data/2.5/weather?q=Seoul&appid=deOxndvhO201sAW

 

 자 주소가 완성되었습니다. 위에 주소를 입력을 하면 아래처럼 텍스트로 된 데이터를 던져줘요. JSON형식이라고 하죠.

{
	"coord": {
		"lon": 126.98,
		"lat": 37.57
	},
	"weather": [
		{
			"id": 800,
			"main": "Clear",
			"description": "clear sky",
			"icon": "01n"
		}
	],
	"base": "stations",
	"main": {
		"temp": 302.25,
		"feels_like": 306.05,
		"temp_min": 301.15,
		"temp_max": 303.15,
		"pressure": 1005,
		"humidity": 70
	},
	"visibility": 10000,
	"wind": {
		"speed": 2.11,
		"deg": 16
	},
	"clouds": {
		"all": 1
	},
	"dt": 1598359440,
	"sys": {
		"type": 1,
		"id": 8117,
		"country": "KR",
		"sunrise": 1598302594,
		"sunset": 1598350333
	},
	"timezone": 32400,
	"id": 1835848,
	"name": "Seoul",
	"cod": 200
}

 

 뭔가 길고 복잡한 것 같지만 대충 보면, 날씨는 Clear 하고 온도는 어떻고 하는 내용이 쭉 나열되어 있어요. 정말 자세한 정보를 간단한 방법으로 지속적으로 얻을 수 있다니 이 API만 가지고 있어도 본인이 필요한 방식으로 요리를 한다면 정말 유용하게 사용할 수 있을 것 같지 않나요?

 

 이제 대략적으로 감을 잡으셨나요? 위 정의를 다시 한번 확인해볼까요?

 

API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다.

 

 우리는 URL 방식으로 https://openweathermap.org/ 라는 웹사이트에서 날씨 정보를 제공받았습니다. 이 정보를 우리가 만든 웹사이트나 응용프로그램에서 돌린다면 우리는 "API를 이용했다!"라고 할 수 있는 것입니다. 간단하죠?

 


 

 이렇게 외부의 응용프로그램이나 웹사이트의 기능을 통해 무어인가를 받는 것도 API의 종류이고, 나의 웹사이트의 경우 Front-End와 Back-End의 데이터 교환도 API 방식으로 만들 수 있고, 그것도 API라고 부를 수 있습니다. 또 누구나 쓸 수 있게 오픈되어 있는 API가 있는 반면에 접근을 제한해 놓은 API도 많죠. 그런 것들은 신청하고 승인을 받고 사용하게 됩니다.

 

 어떤가요? API에 대한 감을 잡는 정도가 되었으면 좋겠습니다. 감을 잡는데 너무 장황하게 설명을 한 게 아닌가 싶기도 하네요. 팁을 하나 드리자면 나라에서도 공공정보에 대한 데이터를 API를 통해 제공하고 있는데 어떤 내용이 있는지 대충 살펴보시면 본인에게 필요한 데이터를 찾을 수 있을지도 모르겠네요.

 

공공데이터포털

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 오늘의 API 설명은 여기까지입니다. 코로나가 유행 중인데 모두 몸조심하시기를!

+ Recent posts