요즘들어 회사에서 REST API 를 통한 다양한 연동 작업들이 많이 진행되고 있다. 물론 전문화된 API 서버가 있는건 아니고 POST 메서드로 JSON 데이터를 전송하는 수준의 연동 작업을 진행중이다. 

 

솔직히 REST API 작업은 난이도로 보면 쉬운 작업에 속하긴 하는데 API 규격서를 제공해야하는 입장이라면 정말 귀찮은 작업이 될 수 있다.  또한 데이터 전달을 양방향 암호화 방식으로 제공해야 하는 경우 상대방 측에서 암/복호화 가 잘 안되는 경우가 많아서 정말 번거로운 작업이 된적도 많이 있었다. 

 

아무튼 REST API는 서로 다른 프로그램간 데이터 전송시 필수로 이용되고 있다. 하지만 이러한 방식이 아닌 URL 파라미터를 통한 간단한 데이터 전송 방식일 경우에는 주로 데이터를 json+base64 인코딩 하여 처리하는데 받는쪽 입장에서는 검증할 수 있는 데이터가 있어야 보안을 강화할 수 있다. 

 

그렇다면 어떤 방식으로 검증 데이터를 넣는게 좋을까? 

 

흔히 URL은 노출되는 데이터이기때문에 추측가능한 방식으로 하는건 좋지 않다. base64로 인코딩된 데이터는 프로그램을 조금 아는 사람이라면 디코딩 하여 데이터들을 추측할 수 있다.  예를 들면 아래와 같다. 

https://admin.redinfo.co.kr/autosignin?data=eyJpZCI6ImFkbWluIiwibmFtZSI6Ilx1YWMxNVx1YmJmYyIsImFnZSI6MzUsImF1dGhfa2V5IjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UifQ==

 

URL을 보면 data 파라미터에 base64 인코딩된 데이터가 있고 이 데이터를 디코딩하면 아래와 같다.

{"id":"admin","name":"강민","age":35,"auth_key":"e10adc3949ba59abbe56e057f20f883e"}

 

받는 쪽에서는 간편하게 auth_key 값으로 검증하여 처리할 수 있다. 하지만 위의 방식은 프로그램을 조금이라도 아는 사람은 데이터를 조작할 수도 있다. 이는 URL로 접근하는 방식이다보니 데이터 검증이 약할 수 밖에 없다. 

 

물론 API 자체가 단순하게 auth_key 에 해당되는 계정내에서만 조회하는 프로그램이라면 크게 문제될건 없겠지만 자동로그인과 같이 auth_key는 검증 키값으로만 사용되고 실제 데이터에 의해 무언가 처리되는 프로그램이라면 보안을 조금더 강화할 필요가 있다. 

 

보안 강화를 위해서는 아래와 같은 시나리오를 생각해 볼 수 있다. 

1. 통신하는 양측 서버간 비밀키를 공유
ex) 비밀키: 41941279a6769671397a228a8440b658

2. 데이터를 전송할 시 timestamp 와 같이 항시 변하는 값을 추가하고 비밀키와 timestamp 값을 md5로 암호화한 결과를 함께 포함하여 전송
ex) timestamp=1727886921 , access_token=md5(1727886921+41941279a6769671397a228a8440b658)

3. 받는쪽에서는 timestamp  값과 비밀키를 md5로 암호화 하여 요청 데이터와 함께 비교한다. 물론 timestamp 값이 없을 경우 에러처리가 필요하다.

 

위의 시나리오는 실제 내가 작업 시에 양측간 통신은 아니더라도 form 데이터 전송시 검증데이터 처리 방법으로 많이 사용하고 있다. 

 

이러한 보안처리는 사용자 인증이나 데이터에 대한 검증이 빈약한 곳에서 간단하게나마 사용할 수 있는 방법으로 사용자 인증이 없는 사이트에서 form 데이터 전송할 시 csrf 방지에도 도움이 된다. 

 

추가로 위와 같이 별도 검증 방법이 아닌 AES 와 같은 암호화 알고리즘을 통해 별도 검증없이 안전하게 데이터를 받을 수 도 있다.  하지만 암호화는 프로그램언어에 따라 복잡도가 다르기 때문에 URL로 처리하는 단순한 프로그램에서 굳이 양방양 암호화를 쓰면서 데이터를 주고 받을 필요는 없다고 생각한다.