SPRING
2017.04.19 / 09:51

REST API µðÀÚÀÎ °¡À̵å

1pips
Ãßõ ¼ö 178

REST API µðÀÚÀÎ °¡À̵å

Á¶´ëÇù(http://bcho.tistory.com)

REST API µðÀÚÀÎÀ» º¸¸é, REST »ç»ó¿¡ ¸ÂÃç¼­ Á¦´ë·Î µðÀÚÀÎ (CRUD¸¦ HTTP method¿¡ ¸ÂÃá)Çϱ⵵ ¾î·Æ°í, URI ConventionµîÀ̳ª º¸¾È, ¹öÀü °ü¸®µî °í·ÁÇÒ »çÇ×ÀÌ ¸¹´Ù. À̹ø ±Û¿¡¼­´Â REST API¸¦ µðÀÚÀο¡ ´ëÇÑ °¡À̵带 ¼Ò°³ÇÏ°íÀÚ ÇÑ´Ù.

µ¿»çº¸´Ù´Â ¸í»ç¸¦ »ç¿ëÇÏÀÚ

URLÀ» ½ÉÇÃÇÏ°í Á÷°üÀûÀ¸·Î ¸¸µéÀÚ

REST API¸¦ URL¸¸ º¸°íµµ, Á÷°üÀûÀ¸·Î ÀÌÇØÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù
URLÀ» ±æ°Ô ¸¸µå´Â°Í º¸´Ù, ÃÖ´ë 2 depth Á¤µµ·Î °£´ÜÇÏ°Ô ¸¸µå´Â °ÍÀÌ ÀÌÇØÇϱâ ÆíÇÏ´Ù.

/dogs
/dogs/1234

URL¿¡ µ¿»çº¸´Ù´Â ¸í»ç¸¦ »ç¿ëÇÑ´Ù.

REST API´Â ¸®¼Ò½º¿¡ ´ëÇؼ­ ÇൿÀ» Á¤ÀÇÇÏ´Â ÇüŸ¦ »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î¼­

POST /dogs

´Â /dogs¶ó´Â ¸®¼Ò½º¸¦ »ý¼ºÇ϶ó´Â Àǹ̷Î, URLÀº HTTP Method¿¡ ÀÇÇØ CRUD (»ý¼º,Àбâ,¼öÁ¤,»èÁ¦)ÀÇ ´ë»óÀÌ µÇ´Â °³Ã¼(¸í»ç)¶ó¾ß ÇÑ´Ù.
À߸øµÈ ¿¹µéÀ» º¸¸é

HTTP Post : /getDogs
HTTP Post : /setDogsOwner

À§ÀÇ ¿¹Á¦´Â ÇàÀ§¸¦ HTTP Post·Î Á¤ÀÇÇÏÁö ¾Ê°í, get/set µîÀÇ ÇàÀ§¸¦ URL¿¡ ºÙÀÎ °æ¿ìÀε¥, ÁÁÁö ¾ÊÀº ¿¹ ÀÌ´Ù. À̺¸´Ù´Â

HTTP Get : /dogs
HTTP Post : /dogs/{puppy}/owner/{terry}

¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.
ÀϹÝÀûÀ¸·Î ±Ç°íµÇ´Â µðÀÚÀÎÀº ´ÙÀ½°ú °°´Ù.

¸®¼Ò½ºPOSTGETPUTDELETE
createreadupdatedelete
/dogs»õ·Î¿î dogs µî·Ïdogs ¸ñ·ÏÀ» ¸®ÅÏBulk·Î ¿©·¯ dogs Á¤º¸¸¦ ¾÷µ¥ÀÌÆ®¸ðµç dogs Á¤º¸¸¦ »èÁ¦
/dogs/baduk¿¡·¯baduk À̶ó´Â À̸§ÀÇ dogs Á¤º¸¸¦ ¸®ÅÏbadukÀ̶ó´Â À̸§ÀÇ dogs Á¤º¸¸¦ ¾÷µ¥ÀÌÆ®baduk À̶ó´Â À̸§ÀÇ dogs Á¤º¸¸¦ »èÁ¦

´Ü¼ö(Singular) º¸´Ù´Â º¹¼ö(Plural)Çü ¸í»ó¸¦ »ç¿ëÇÑ´Ù.

µÇµµ·ÏÀ̸é Ãß»óÀûÀÎ À̸§º¸´Ù ±¸Ã¼ÀûÀÎ À̸§À» »ç¿ëÇÏÀÚ

¸®¼Ò½º°£ÀÇ °ü°è¸¦ Ç¥ÇöÇÏ´Â ¹æ¹ý

Option A.

´Ù¸¥ ¸®¼Ò½º¿ÍÀÇ °ü°è¸¦ Ç¥Çö. ¿¹¸¦ µé¾î owner°¡ °¡Áö°í ÀÖ´Â °³(dogs) ¸ñ·Ï

GET /owner/{terry}/dogs

¿Í °°ÀÌ /resource¸í/identifier/other-related-resource ÇüÅ·Î, ÇØ´ç ¸®¼Ò½º¿¡ ´ëÇÑ °æ·Î¸¦ /resource¸í/{±× ¸®¼Ò½º¿¡ ´ëÇÑ identifier}/{¿¬°üµÇ´Â ´Ù¸¥ ¸®¼Ò½º other-related-resource} ÇüÅ·ΠǥÇöÇÑ´Ù.

Option B.

https://usergrid.incubator.apache.org/docs/relationships/ ¿¡ º¸¸é ´Ù¸¥ ÇüÅÂÀÇ °ü°è Á¤ÀÇ ¹æ¹ý¿¡ ´ëÇؼ­ ³ª¿Í Àִµ¥, Á¶±Ý ´õ ±¸Ã¼ÀûÀÎ API °ü°è Á¤ÀÇ ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.

/resource/identifier/relation/other-related-resource
GET /owner/terry/likes/dogs

ÀÌ ¹æ½ÄÀº ¸®¼Ò½º°£ÀÇ °ü°è(relationship)À» URL ³»¿¡ Á¤ÀÇÇÏ´Â ¹æ¹ýÀ¸·Î,ÈξÀ ´õ ¸í½ÃÀûÀÏ ¼ö ÀÖ´Ù. (¼¼·ÃµÇ¾î º¸ÀÌÁö´Â ¾ÊÁö¸¸)
¸®¼Ò½º°£ÀÇ °ü°è°¡ º¹ÀâÇÏÁö ¾ÊÀº ¼­ºñ½ºÀÇ °æ¿ì¿¡´Â Option A¸¦, ¸®¼Ò½º°£ÀÇ °ü°è°¡ ´Ù¼Ò º¹ÀâÇÑ °æ¿ì¿¡´Â Option B¸¦ »ç¿ëÇϵµ·Ï ÇÑ´Ù.

¿¡·¯ ó¸®

¿¡·¯ ó¸®ÀÇ ±âº»Àº HTTP Response Code¸¦ »ç¿ëÇÑÈÄ, Response body¿¡ error detailÀ» »ç¿ëÇØÁÖ´Â °ÍÀÌ ÁÁ´Ù.

Use HTTP Status Code

HTTP Status Code´Â ´ë·« 70°³ÀÇ Äڵ尡 ÀÖ´Ù. ÀϹÝÀûÀÎ °³¹ßÀÚµéÀÌ ¸ðµç Äڵ带 ±â¾ïÇÒ¸®´Â ¾ø°í, ¿¡·¯ Äڵ忡¼­´Â ÀÚÁÖ »ç¿ëµÇ´Â ¸î°³ÀÇ Äڵ常 Àǹ̿¡ ¸ÂÃç¼­ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.
GoogleÀÇ GDataÀÇ °æ¿ì¿¡´Â 10°³, NeflixÀÇ °æ¿ì¿¡´Â 9°³, DiggÀÇ °æ¿ì¿¡´Â 8°³¸¦ »ç¿ëÇÑ´Ù.
(¡Ø http://info.apigee.com/Portals/62317/docs/web%20api.pdf)

  • Google GData
    200 201 304 400 401 403 404 409 410 500
  • Netflix
    200 201 304 400 401 403 404 412 500
  • Digg
    200 400 401 403 404 410 500 503

ÇÊÀÚÀÇ °æ¿ì, ¾Æ·¡¿Í °°Àº Á¤µµÀÇ HTTP Code¸¦ »ç¿ëÇϱ⸦ ±ÇÀåÇÑ´Ù.

  • 200 ¼º°ø
  • 400 Bad Request - field validation ½ÇÆнÃ
  • 401 Unauthorized - API ÀÎÁõ,Àΰ¡ ½ÇÆÐ
  • 404 Not found
  • 500 Internal Server Error - ¼­¹ö ¿¡·¯

ÀÚ¼¼ÇÑ HTTP Status Code´Â http://en.wikipedia.org/wiki/Http_error_codes ¸¦ Âü°íÇϱ⠹ٶõ´Ù.

Error Message

HTTP Status Code ÀÌ¿Ü¿¡, Response body¿¡ detailÇÑ ¿¡·¯ Á¤º¸¸¦ Ç¥ÇöÇÏ´Â °ÍÀÌ ÁÁÀºµ¥,
TwilloÀÇ Error Message Çü½ÄÀÇ °æ¿ì

HTTP Status Code : 401
{¡°status¡±:¡±401¡±,¡±message¡±:¡±Authenticate¡±,¡±code¡±:200003,¡±more info¡±:¡±http://www.twillo.com/docs/errors/20003"}

¿Í °°ÀÌ Ç¥ÇöÇϴµ¥, ¿¡·¯ ÄÚµå #¿Í ÇØ´ç ¿¡·¯ ÄÚµå #¿¡ ´ëÇÑ Error dictionary link¸¦ Á¦°øÇÑ´Ù.
ºñ´Ü API »Ó ¾Æ´Ï¶ó, Àß Á¤ÀÇµÈ ¼ÒÇÁÆ®¿þ¾î Á¦Ç°ÀÇ °æ¿ì¿¡´Â º°µµÀÇ Error # ¿¡ ´ëÇÑ Dictionary ¸¦ Á¦°øÇϴµ¥, OracleÀÇ WebLogicÀÇ °æ¿ì¿¡µµhttp://docs.oracle.com/cd/E24329_01/doc.1211/e26117/chapter_bea_messages.htm#sthref7 ¿Í °°ÀÌ Error #¿Í, ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸í°ú, Á¶Ä¡ ¹æ¹ýµîÀ» ¼³¸íÇÑ´Ù. ÀÌ´Â °³¹ßÀÚ³ª Trouble ShootingÇÏ´Â »ç¶÷¿¡°Ô ¸¹Àº Á¤º¸¸¦ Á¦°øÇؼ­, Á¶±Ý ´õ µð¹ö±ëÀ» ¼Õ½±°Ô ÇÑ´Ù. (°¡±ÞÀûÀ̸é Error Code #¸¦ Á¦°øÇÏ´Â °ÍÀÌ ÁÁ´Ù.)

Error Stack

¿¡·¯¸Þ¼¼Áö¿¡¼­ Error Stack Á¤º¸¸¦ Ãâ·ÂÇÏ´Â °ÍÀº ´ë´ÜÈ÷ À§ÇèÇÑ ÀÏÀÌ´Ù. ³»ºÎÀûÀÎ ÄÚµå ±¸Á¶¿Í ÇÁ·¹ÀÓ¿÷ ±¸Á¶¸¦ ¿ÜºÎ¿¡ ³ëÃâÇÔÀ¸·Î½á, ÇØÄ¿µé¿¡°Ô, ÇØÅ·À» ÇÒ ¼ö ÀÖ´Â Á¤º¸¸¦ Á¦°øÇϱ⠶§¹®ÀÌ´Ù. ÀϹÝÀûÀÎ ¼­ºñ½º ±¸Á¶¿¡¼­´Â ¾Æ·¡¿Í °°Àº ¿¡·¯ ½ºÅÃÁ¤º¸¸¦ API ¿¡·¯ ¸Þ¼¼Áö¿¡ Æ÷ÇÔ ½ÃÅ°Áö ¾Ê´Â °ÍÀÌ ¹Ù¶÷Á÷ ÇÏ´Ù.

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: stacktrace.log (Permission denied)
at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.(FileOutputStream.java:177)
at java.io.FileOutputStream.(FileOutputStream.java:102)
at org.apache.log4j.FileAppender.setFile(FileAppender.java:290)
at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

±×·¸Áö¸¸, ³»ºÎ °³¹ßÁßÀ̰ųª µð¹ö±ë ½Ã¿¡´Â ¸Å¿ì À¯¿ëÇѵ¥, API ¼­ºñ½º¸¦ °³¹ß½Ã, ¼­¹öÀÇ ¸ðµå¸¦ production°ú dev ¸ðµå·Î ºÐ¸®Çؼ­, ¿É¼Ç¿¡ µû¶ó dev ¸ðµåµîÀ¸·Î ±âµ¿½Ã, REST APIÀÇ ¿¡·¯ ÀÀ´ä ¸Þ¼¼Áö¿¡ ¿¡·¯ ½ºÅà Á¤º¸¸¦ Æ÷ÇÔÇؼ­ ¸®ÅÏÇϵµ·Ï Çϸé, µð¹ö±ë¿¡ ¸Å¿ì À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù.

¹öÀü °ü¸®

API Á¤ÀÇ¿¡¼­ Áß¿äÇÑ °ÍÁßÀÇ Çϳª´Â ¹öÀü °ü¸®ÀÌ´Ù. ÀÌ¹Ì ¹èÆ÷µÈ API ÀÇ °æ¿ì¿¡´Â °è¼ÓÇؼ­ ¼­ºñ½º¸¦ Á¦°øÇϸ鼭,»õ·Î¿î ±â´ÉÀÌ µé¾î°£ »õ·Î¿î API¸¦ ¹èÆ÷ÇÒ¶§´Â ÇÏÀ§ ȣȯ¼ºÀ» º¸ÀåÇϸ鼭 ¼­ºñ½º¸¦ Á¦°øÇØ¾ß Çϱ⠶§¹®¿¡, °°Àº API¶óµµ ¹öÀü¿¡ µû¶ó¼­ ´Ù¸¥ ±â´ÉÀ» Á¦°øÇϵµ·Ï ÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.
APIÀÇ ¹öÀüÀ» Á¤ÀÇÇÏ´Â ¹æ¹ý¿¡´Â ¿©·¯°¡Áö°¡ Àִµ¥,

  • Facebook ?v=2.0
  • salesforce.com /services/data/v20.0/sobjects/Account
    ÇÊÀÚÀÇ °æ¿ì¿¡´Â

    {servicename}/{version}/{REST URL}
    example) api.server.com/account/v2.0/groups

ÇüÅ·ΠÁ¤ÀÇ ÇÏ´Â °ÍÀ» ±ÇÀåÇÑ´Ù.
ÀÌ´Â ¼­ºñ½ºÀÇ ¹èÆ÷ ¸ðµ¨°ú °ü°è°¡ Àִµ¥, ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀÇ °æ¿ì, account.v1.0.war, account.v2.0.war¿Í °°ÀÌ ´Ù¸¥ war·Î °¢°¢ ¹èÆ÷ÇÏ¿© ¹öÀüº°·Î ¹èÆ÷ ¹ÙÀ̳ʸ®¸¦ °ü¸®ÇÒ ¼ö ÀÖ°í, ¾Õ´Ü¿¡ ¼­ºñ½º ¸íÀ» º°µµÀÇ URL·Î ¶¼¾î ³õ´Â °ÍÀº ÇâÈÄ ¼­ºñ½º°¡ È®ÀåµÇ¾úÀ» °æ¿ì¿¡, account ¼­ºñ½º¸¸ º°µµÀÇ ¼­¹ö·Î ºÐ¸®Çؼ­ ¹èÆ÷ÇÏ´Â °æ¿ì¸¦ »ý°¢ÇÒ ¼ö ÀÖ´Ù.
¿ÜºÎ·Î Á¦°øµÇ´Â URLÀº api.server.com/account/v2.0/groups·Î ÇϳªÀÇ ¼­¹ö¸¦ °¡¸£Å°Áö¸¸, ³»ºÎÀûÀ¸·Î, HAProxyµîÀÇ reverse proxy¸¦ ÀÌ¿ëÇؼ­ ÀÌ·± URLÀ» ¸ÊÇÎÇÒ ¼ö Àִµ¥, api.server.com/account/v2.0/groups¸¦ ³»ºÎÀûÀ¸·Î account.server.com/v2.0/groups ·Î ¸ÊÇÎ Çϵµ·Ï Çϸé, ¿ÜºÎ¿¡ ³ëÃâµÇ´Â URL º¯°æÀÌ ¾øÀÌ ÇâÈÄ È®ÀåµÇ¾úÀ»¶§ ¼­¹ö¸¦ ¹°¸®ÀûÀ¸·Î ºÐ¸®Çس»±â°¡ Æí¸®ÇÏ´Ù.

ÆäÀÌ¡ ó¸®¿Í Partial response

ÆäÀÌ¡

Å« »çÀÌÁîÀÇ ¸®½ºÆ® ÇüÅÂÀÇ ÀÀ´äÀ» ó¸®Çϱâ À§Çؼ­ ÇÊ¿äÇÑ °ÍÀº ÆäÀÌ¡ ó¸®¿Í partial response ó¸®ÀÌ´Ù. ¸®½ºÆ® ³»¿ëÀÌ 1000,000°³Àε¥, À̸¦ ÇϳªÀÇ HTTP Response·Î ó¸®ÇÏ´Â °ÍÀº ¼­¹ö ¼º´É, ³×Æ®¿öÅ© ºñ¿ëµµ ¹®Á¦Áö¸¸ ¹«¾ùº¸´Ù ºñÇö½ÇÀûÀÌ´Ù. ±×·¡¼­, ÆäÀÌ¡À» °í·ÁÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù.
ÆäÀÌ¡À» ó¸®Çϱâ À§Çؼ­´Â ¿©·¯°¡Áö µðÀÚÀÎÀÌ ÀÖ´Ù.

¿¹¸¦ µé¾î 100¹ø° ·¹ÄÚµåºÎÅÍ 125¹ø° ·¹ÄÚµå±îÁö ¹Þ´Â API¸¦ Á¤ÀÇÇϸé

  • Facebook API ½ºÅ¸ÀÏ : /record?offset=100&limit=25
  • Twitter API ½ºÅ¸ÀÏ : /record?page=5&rpp=25 (RPP´Â Record per page·Î ÆäÀÌÁö´ç ·¹ÄÚµå¼ö·Î RPP=25À̸é ÆäÀÌÁö 5´Â 100~125 ·¹Äڵ尡 µÈ´Ù.)
  • LikedIn API ½ºÅ¸ÀÏ : /record?start=50&count=25

apigeeÀÇ API°¡À̵带 º¸¸é Á»´õ Á÷°üÀûÀ̶ó´Â ÀÌÀ¯·Î ÆäÀ̽ººÏ ½ºÅ¸ÀÏÀ» ±ÇÀåÇÏ°í ÀÖ´Ù.
record?offset=100&limit=25

Partial Response (Optional)

¸®¼Ò½º¿¡ ´ëÇÑ ÀÀ´ä ¸Þ¼¼Áö¿¡ ´ëÇؼ­ ±»ÀÌ ¸ðµç Çʵ带 Æ÷ÇÔÇÒ ÇÊ¿ä°¡ ¾ø´Â ÄÉÀ̽º°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î ÆäÀ̽ººÏ FEEDÀÇ °æ¿ì¿¡´Â »ç¿ëÀÚ ID, À̸§, ±Û ³»¿ë, ³¯Â¥, ÁÁ¾Æ¿ä Ä«¿îÆ®, ´ñ±Û, »ç¿ëÀÚ »çÁøµîµî ¿©·¯°¡Áö Á¤º¸¸¦ °®´Âµ¥, API¸¦ ¿äûÇÏ´Â ClientÀÇ ¿ëµµ¿¡ µû¶ó ¼±º°ÀûÀ¸·Î ¸î°¡Áö Çʵ常ÀÌ ÇÊ¿äÇÑ °æ¿ì°¡ ÀÖ´Ù. Çʵ带 Á¦ÇÑÇÏ´Â °ÍÀº Àüü ÀÀ´äÀÇ ¾çÀ» ÁÙ¿©¼­ ³×Æ®¿öÅ© ´ë¿ªÆø(ƯÈ÷ ¸ð¹ÙÀÏ¿¡¼­) Àý¾àÇÒ ¼ö ÀÖ°í, ÀÀ´ä ¸Þ¼¼Áö¸¦ °£¼ÒÈ­ÇÏ¿© ÆĽ̵îÀ» °£·«È­ÇÒ ¼ö ÀÖ´Ù.
±×·¡¼­ ¸î¸î Àß µðÀÚÀεÈ, REST APIÀÇ °æ¿ì ÀÌ·¯ÇÑ Partial Response ±â´ÉÀ» Á¦°øÇϴµ¥, ÁÖ¿ä ¼­ºñ½ºµéÀ» ºñ±³Çغ¸¸é ´ÙÀ½°ú °°´Ù.

  • Linked in : /people:(id,first-name,last-name,industry)
  • Facebook : /terry/friends?fields=id,name
  • Google : ?fields=title,media:group(media:thumnail)
    Linked in ½ºÅ¸ÀÏÀÇ °æ¿ì °¡µ¶¼ºÀº ³ôÁö¸¸ :()·Î ±¸º°Çϱ⠶§¹®¿¡, HTTP ÇÁ·¹ÀÓ¿÷À¸·Î ÆĽÌÇϱⰡ ¾î·Æ´Ù. Àüü¸¦ ÇϳªÀÇ URL·Î ÀνÄÇÏ°í, :( ºÎºÐÀ» º°µµÀÇ Parameter·Î ±¸º°ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù.
    Facebook°ú GoogleÀº ºñ½ÁÇÑ Á¢±Ù ¹æ¹ýÀ» »ç¿ëÇϴµ¥, ƯÈ÷ GoogleÀÇ ½ºÅ¸ÀÏÀº ´õ Àç¹ÌÀִµ¥, group(media:thumnail) ¿Í °°ÀÌ JSONÀÇ Sub-Object °³³äÀ» Áö¿øÇÑ´Ù.
    Partial Response´Â Google ½ºÅ¸ÀÏÀ» ÀÌ¿ëÇÏ´Â °ÍÀ» ±ÇÀåÇÑ´Ù.

°Ë»ö

°Ë»öÀº ÀϹÝÀûÀ¸·Î HTTP GET¿¡¼­ Query String¿¡ °Ë»ö Á¶°ÇÀ» Á¤ÀÇÇÏ´Â °æ¿ì°¡ ÀϹÝÀûÀε¥, ÀÌ °æ¿ì °Ë»öÁ¶°ÇÀÌ ´Ù¸¥ Query String°ú ¼¯¿© ¹ö¸± ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î name=choÀÌ°í, region=seoulÀÎ »ç¿ëÀÚ¸¦ °Ë»öÇÏ´Â °Ë»öÀ» Query String¸¸ »ç¿ëÇÏ°Ô µÇ¸é ´ÙÀ½°ú °°ÀÌ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.
/users?name=cho&region=seoul
±×·±µ¥, ¿©±â¿¡ ÆäÀÌ¡ 󸮸¦ Ãß°¡ÇÏ°Ô µÇ¸é

/users?name=cho&region=seoul&offset=20&limit=10

ÆäÀÌ¡ 󸮿¡ Á¤ÀÇµÈ offset°ú limit°¡ °Ë»ö Á¶°ÇÀÎÁö ¾Æ´Ï¸é ÆäÀÌ¡ Á¶°ÇÀÎÁö ºÐ°£ÀÌ ¾È°£´Ù. ±×·¡¼­, Äõ¸® Á¶°ÇÀº ÇϳªÀÇ Query StringÀ¸·Î Á¤ÀÇÇÏ´Â °ÍÀÌ ÁÁÀºµ¥

/user?q=name%3Dcho,region%3Dseoul&offset=20&limit=10

ÀÌ·±½ÄÀ¸·Î °Ë»ö Á¶°ÇÀ» URLEncode¸¦ ½á¼­ ¡°q=name%3Dcho,region%3D=seoul¡± ó·³ (½ÇÁ¦·Î´Â q= name=cho,region=seoul )Ç¥ÇöÇÏ°í Deleminator¸¦ , µîÀ» »ç¿ëÇÏ°Ô µÇ¸é °Ë»ö Á¶°ÇÀº ´Ù¸¥ Query ½ºÆ®¸µ°ú ºÐ¸®µÈ´Ù.
¹°·Ð ÀÌ °Ë»ö Á¶°ÇÀº ¼­¹ö¿¡ ÀÇÇؼ­ ÅäÅ« ´ÜÀ§·Î ÆĽ̵Ǿî¾ß Çϳ®.

Àü¿ª °Ë»ö°ú ¸®¼Ò½º °Ë»ö

´ÙÀ½À¸·Î´Â °Ë»öÀÇ ¹üÀ§¿¡ ´ëÇؼ­ °í·ÁÇÒ ÇÊ¿ä°¡ Àִµ¥, Àü¿ª °Ë»öÀº Àüü ¸®¼Ò½º¿¡ ´ëÇÑ °Ë»öÀ», ¸®¼Ò½º¿¡ ´ëÇÑ °Ë»öÀº ƯÁ¤ ¸®¼Ò½º¿¡ ´ëÇÑ °Ë»öÀ» Á¤ÀÇÇÑ´Ù.
¿¹¸¦ µé¾î ½Ã½ºÅÛ¿¡ user,dogs,cars¿Í °°Àº ¸®¼Ò½º°¡ Á¤ÀǵǾî ÀÖÀ»¶§,id=¡¯terry¡¯ÀÎ ¸®¼Ò½º¿¡ ´ëÇÑ Àü¿ª °Ë»öÀº

/search?q=id%3Dterry

¿Í °°Àº ½ÄÀ¸·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. /search¿Í °°Àº Àü¿ª °Ë»ö URI¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
¹Ý´ë·Î ƯÁ¤ ¸®¼Ò½º¾È¿¡¼­¸¸ÀÇ °Ë»öÀº

/users?q=id%3Dterry

¿Í °°ÀÌ ¸®¼Ò½º¸í¿¡ Äõ¸® Á¶°ÇÀ» ºÙÀÌ´Â ½ÄÀ¸·Î Ç¥ÇöÀÌ °¡´ÉÇÏ´Ù.

HATEOAS (Optional)

HATEOS´Â Hypermedia as the engine of application stateÀÇ ¾à¾î·Î, µðÀÚÀÎÀÇ ¿äÁö´Â ÇÏÀÌÆ۹̵ð¾îÀÇ Æ¯Â¡À» ÀÌ¿ëÇÏ¿© HTTP Response¿¡ ´ÙÀ½ Action¿¡ ´ëÇÑ HTTP Link¸¦ ÇÔ²² ¸®ÅÏÇÏ´Â °ÍÀÌ´Ù.
¿¹¸¦ µé¾î ¾Õ¼­ ¼³¸íÇÑ ÆäÀÌ¡ ó¸®ÀÇ °æ¿ì, ¸®ÅϽÃ, ÀüÈÄÆäÀÌÁö¿¡ ´ëÇÑ ¸µÅ©¸¦ Á¦°øÇѴٰųª

HTTP GET users?offset=10&limit=5
{
[
{¡®id¡¯:¡¯user1¡¯,¡¯name¡¯:¡¯terry¡¯}
,{¡®id¡¯:¡¯user2¡¯,¡¯name¡¯:¡¯carry¡¯}
]
,¡¯links¡¯ :[
{
¡®rel¡¯:¡¯pre_page¡¯,
¡®href¡¯:¡¯http://xxx/users?offset=6&limit=5¡®
}
,
{
¡®rel¡¯:¡¯next_page¡¯,
¡®href¡¯:¡¯http://xxx/users?offset=11&limit=5¡®
}
]
}
¿Í °°ÀÌ Ç¥ÇöÇϰųª
¿¬°üµÈ ¸®¼Ò½º¿¡ ´ëÇÑ µðÅ×ÀÏÇÑ ¸µÅ©¸¦ Ç¥½Ã ÇÏ´Â °Íµî¿¡ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.
HTTP GET users/terry
{
¡®id¡¯:¡¯terry¡¯
¡®links¡¯:[{
¡®rel¡¯:¡¯friends¡¯,
¡®href¡¯:¡¯http://xxx/users/terry/friends¡®
}]
}

HATEOAS¸¦ API¿¡ Àû¿ëÇÏ°Ô µÇ¸é, Self-Descriptive Ư¼ºÀÌ Áõ´ëµÇ¾î API¿¡ ´ëÇÑ °¡µ¶¼ºÀÌ Áõ°¡ÇÏ´Â ÀåÁ¡À» °¡Áö°í ÀÖ±â´Â ÇÏÁö¸¸, ÀÀ´ä ¸Þ¼¼Áö°¡ ´Ù¸¥ ¸®¼Ò½º URI¿¡ ´ëÇÑ ÀÇÁ¸¼ºÀ» °¡Áö±â ¶§¹®¿¡, ±¸ÇöÀÌ ´Ù¼Ò ±î´Ù·Ó´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.
¿äÁòÀº Spring°ú °°Àº ÇÁ·¹ÀÓ¿÷¿¡¼­ ÇÁ·¹ÀÓ¿÷ Â÷¿ø¿¡¼­ HATEOAS¸¦ Áö¿øÇÏ°í ÀÖÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.http://spring.io/understanding/HATEOAS

´ÜÀÏ API URL

API ¼­¹ö°¡ ¹°¸®ÀûÀ¸·Î ºÐ¸®µÈ ¿©·¯°³ÀÇ ¼­¹ö¿¡¼­ µ¿ÀÛÇÏ°í ÀÖÀ»¶§, user.apiserver.com, car.apiserver.com°ú °°ÀÌ API ¼­ºñ½º¸¶´Ù URLÀÌ ºÐ¸®µÇ¾î ÀÖÀ¸¸é °³¹ßÀÚ°¡ »ç¿ëÇϱ⠺ÒÆíÇÏ´Ù. ¸Å¹ø ´Ù¸¥ ¼­¹ö·Î ¿¬°áÀ» ÇؾßÇÏ°Å´Ï¿Í Áß°£¿¡ ¹æÈ­º®ÀÌ¶óµµ ÀÖÀ¸¸é, ÀÏÀÏÀÌ ¹æÈ­º®À» ÇØÁ¦ÇØ¾ß ÇÑ´Ù.
API ¼­ºñ½º´Â ¹°¸®ÀûÀ¸·Î ¼­¹ö°¡ ºÐ¸®µÇ¾î ÀÖ´õ¶óµµ ´ÜÀÏ URLÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁÀºµ¥, ¹æ¹ýÀº HAProxy³ª nginx¿Í °°Àº reverse proxy¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù.
HAProxy¸¦ ¾Õ¿¡ »õ¿ì°í api.apiserver.comÀ̶ó´Â ´ÜÀÏ URLÀ» ±¸ÃàÇÑÈÄ¿¡
HAProxy ¼³Á¤¿¡¼­

api.apiserver.com/user´Â user.apiserver.com ·Î ¶ó¿ìÆÃÇÏ°Ô ÇÏ°í
api.apiserver.com/car ´Â car.apiserver.comÀ¸·Î ¶ó¿ìÆà Çϵµ·Ï ±¸ÇöÇÏ¸é µÈ´Ù.

º¸¾È

API ¼­ºñ½º¿¡ À־ º¸¾ÈÀº ¸Å¿ì Áß¿äÇÑ ¿ä¼ÒÀÌ´Ù. API ¿¡ ´ëÇÑ º¸¾ÈÀº ´ÙÀ½°ú °°ÀÌ º¸¾È ´ë»ó¿¡ µû¶ó¼­ ¸î°¡Áö·Î ³ª´²Áø´Ù.

ÀÎÁõ

ÀÎÁõÀº, API¸¦ È£ÃâÇϴ Ŭ¶óÀ̾ðÆ®°¡ VALIDÇÑ »ç¿ëÀÚÀÎÁö, ºÒ¹ýÀûÀÎ »ç¿ëÀÚÀÎÁö¸¦ ±¸º°ÇÏ´Â ¹æ½ÄÀÌ´Ù.

HTTP Basic Auth

°¡Àå ½¬¿î ¹æ½ÄÀ¸·Î´Â »ç¿ëÀÚ id,password¸¦ Ç¥ÁØ HTTP Basic Auth¿¡ ³Ö¾î¼­ Àü¼ÛÇÏ´Â ¹æ½ÄÀ¸·Î »ç¿ëÀÚ ´ÜÀ§ÀÇ ÀÎÁõ°ú ±ÇÇÑ ÄÁÆ®·ÑÀÌ °¡´ÉÇÏ´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù. ±×·¯³ª ÀÌ °æ¿ì, ¸Å¹ø »ç¿ëÀÚ id¿Í password°¡ ³×Æ®¿öÅ©¸¦ ÅëÇؼ­ Àü¼ÛµÇ±â ¶§¹®¿¡, ÇØÄ¿¿¡ ÀÇÇؼ­ »ç¿ëÀÚ id,password°¡ ´©ÃâµÉ ¼ö ÀÖ´Ù. »ç¿ëÀÚ id,password°¡ ´©ÃâµÇ¸é API È£Ãâ ±ÇÇѻӸ¸ ¾Æ´Ï¶ó À¥¿¡ ·Î±×ÀÎÇؼ­ ´Ù¸¥ ¼­ºñ½º¸¦ »ç¿ëÇÏ´Â µî Ä¡¸íÀûÀ̱⠶§¹®¿¡ ±×¸® ±ÇÀåµÇÁö ¾Ê´Â ¹æ¹ýÀÌ´Ù.
SSLÀ» »ç¿ëÇؼ­ ¾ÏȣȭÇÒ ¼ö ´Â ÀÖ°ÚÁö¸¸ ±âº»ÀûÀ¸·Î SSLÀº Man in the middle attack (Áß°£¿¡ ÀÎÁõ¼­¸¦ °¡·Îü¼­ SSL ÆÐŶÀ» ¿­¾îº¸´Â ¹æ¹ý) ¿¡ Ãë¾àÇϱ⠶§¹®¿¡ ¿Ïº®ÇÏ´Ù°í º¼ ¼ö ¾ø´Ù.

Access Token

¸Å¹ø ³×Æ®¿öÅ©¸¦ ÅëÇؼ­ »ç¿ëÀÚ id,password¸¦ º¸³»´Â °ÍÀÌ À§ÇèÇÏ´Ù¸é, óÀ½ ÀÎÁõ½Ã¿¡¸¸ id,password¸¦ º¸³»°í, ÀÎÁõÀÌ ¼º°øÇÏ¸é ¼­¹ö¿¡¼­ access_tokenÀ» ¹ß±ÞÇÏ¿© API È£Ãâ½Ã access_tokenÀ¸·Î¸¸ È£ÃâÇÏ´Â ¹æ½ÄÀÌ´Ù. (OAuth2.0ÀÌ À¯»çÇÑ ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇÑ´Ù.) ÀÌ °æ¿ì API¸¦ È£ÃâÇϴ Ŭ¶óÀ̾ðÆ®°¡ access_tokenÀ» ÀúÀåÇÏ´Â ¸ÞÄ«´ÏÁòÀ» °¡Á®¾ß ÇÑ´Ù. ¶ÇÇÑ access_tokenÀÌ ´©ÃâµÉ¶§¸¦ ´ëºñÇÏ¿©, ¼­¹öÂÊ¿¡¼­ compromisedµÈ (³ëÃâµÈ/¿À¿°µÈ) tokenÀÇ °æ¿ì revoke(»ç¿ë±ÝÁö ó¸®)¸¦ ÇÏ°í, Ŭ¶óÀ̾ðÆ®¿¡°Ô ´Ù½Ã access_tokenÀ» ¹ß±ÞÇϵµ·Ï ÇÏ´Â ¸ÞÄ¿´ÏÁò°ú, Expire timeÀ» µÖ¼­ ÁÖ±âÀûÀ¸·Î tokenÀ» ±³Ã¼Çϵµ·Ï ÇÏ´Â ¹æ½ÄÀÌ ÁÁ´Ù.

API Key

API Key ½Ã³ª¸®¿À´Â ÀϹÝÀûÀ¸·Î API Á¦°øÀÚ°¡ API Æ÷Å»µîÀ» ÅëÇؼ­, °³¹ßÀÚ¸¦ ÀÎÁõÇÏ°í °³¹ßÀÚ¿¡°Ô API Key¸¦ ¹ß±ÞÇÑÈÄ, °³¹ßÀÚ°¡ API Key¸¦ ¾ÖÇø®ÄÉÀÌ¼Ç Äڵ峻¿¡ žÀçÇؼ­ »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. API¸¦ ¿ÜºÎ ÆÄÆ®³Ê¿¡°Ô °ø°³ÇÏ´Â °æ¿ì¿¡ ¼Õ½±°Ô »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ²Ï ¸¹ÀÌ »ç¿ëµÇ´ø ¹æ½ÄÀÌ´Ù. ´Ü ¾ÖÇø®ÄÉÀÌ¼Ç (ƯÈ÷ ¸ð¹ÙÀÏ ¾ÖÇø®ÄÉÀ̼Ç)ÀÌ µðÄÄÆÄÀÏ µÉ °æ¿ì API Key°¡ ´©ÃâµÉ ¼ö ÀÖ´Â À§Ç輺À» °¡Áö°í Àֱ⠶§¹®¿¡, API Key¸¦ Àß °ü¸® ÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. (³­µ¶È­¸¦ ÇÑ´Ù´ø°¡)
ÀÌ ½Ã³ª¸®¿ÀÀÇ °æ¿ì ¾ÖÇø®ÄÉÀÌ¼Ç ´ÜÀ§ÀÇ ÀÎÁõÀ» Çϱ⠶§¹®¿¡ ¾Õ¼­ ¼³¸íÇÑ µÎ ¹æ½Äó·³ »ç¿ëÀÚ ´ÜÀ§ÀÇ ÀÎÁõÀº ºÒ°¡´É ÇÏ´Ù.
(»ç¿ëÀÚ ´ÜÀ§ÀÇ ÀÎÁõÀÌ ÇÊ¿äÇÑ °æ¿ì API Key·Î ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÎÁõÇÑ ÈÄ¿¡, Ŭ¶óÀ̾ðÆ® ¸¶´Ù »õ·Î¿î access_tokenÀ» ¹ß±ÞÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. »ç½Ç ÀÌ°Ô OAuth 2.0ÀÇ client_secret°ú access_token ½Ã³ª¸®¿À¿Í À¯»çÇÏ´Ù.)

OAuth 2.0 (Recommended)

OAuth´Â ±Ù·¡¿¡ °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â API Àΰ¡/ÀÎÁõ ±â¼úÀÌ´Ù. Ư¡ÁßÀÇ Çϳª´Â Authentication(ÀÎÁõ)¸¸ÀÌ ¾Æ´Ï¶ó ±ÇÇÑ¿¡ ´ëÇÑ ÅëÁ¦(Authorization)ÀÌ °¡´ÉÇϴٴ Ư¡À» °¡Áö°í ÀÖÀ¸¸ç, 3 legged ÀÎÁõÀ» ÅëÇؼ­, ÆÄÆ®³Ê»ç°¡ API¸¦ »ç¿ëÇÒ °æ¿ì, ÀÎÁõ½Ã¿¡ »ç¿ëÀÚ ID¿Í ºñ¹Ð¹øÈ£¸¦ ÆÄÆ®³Ê¿¡°Ô ³ëÃâÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Â ÀåÁ¡ÀÌ ÀÖ´Ù. (ÆäÀ̽ººÏ °èÁ¤À» ÀÌ¿ëÇÑ À¥ ¾ÖÇø®ÄÉÀ̼ǵéÀ» º¸¸é °¡²û, ÆäÀ̽ººÏ ·Î±×ÀÎ È­¸éÀ¸·Î ¸®´ÙÀÌ·ºÆ®µÇ¾î ¡°XX ¾ÖÇø®ÄÉÀ̼ÇÀÌ XX¿¡ ´ëÇÑ ±ÇÇÑÀ» ¿äûÇÕ´Ï´Ù. ¼ö¶ôÇϽðڽÀ´Ï±î?¡±¿Í °°Àº âÀÌ ¶ß´Â °ÍÀ» º¼ ¼ö Àִµ¥, ÆäÀ̽ººÏ ·Î±×ÀÎ È­¸é¿¡, »ç¿ëÀÚ ID¿Í ºñ¹Ð ¹øÈ£¸¦ ³Ö°í ÆäÀ̽ººÏÀº ÀÎÁõÀÌ µÇ¾ú´Ù´Â Á¤º¸¸¦ ÀÎÁõÀ» ¿äûÇÑ À¥¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î º¸³»¼­, ÇØ´ç »ç¿ëÀÚ°¡ ÀÎÁõµÇ¾úÀ½À» ¾Ë·ÁÁØ´Ù. ÀÌ°æ¿ì, À¥ ¾ÖÇø®ÄÉÀ̼ÇÀº »ç¿ëÀÚÀÇ ºñ¹Ð¹øÈ£¸¦ ¾Ë ¼ö ¾ø´Ù. )
±âº»ÀûÀÎ OAuthÀÇ ¿ø¸®´Â, »ç¿ëÀÚ ID/PASSWD·Î ÀÎÁõÀ» ÇÑ ÈÄ¿¡, access_tokenÀ» ¹Þ¾Æ¼­, access_tokenÀ» ÀÌ¿ëÇؼ­ ÃßÈÄ Ä¿¹Â´ÏÄÉÀ̼ÇÀ» ÇÏ´Â ¹æ½ÄÀÌ´Ù.

OAuth´Â Å©°Ô ¿ëµµ¿¡ µû¶ó 4°¡Áö ŸÀÔÀÇ ÀÎÁõ ¹æ½ÄÀ» Á¦°øÇÑ´Ù.

  • Authorization Code ¹æ½Ä - ÁÖ·Î À¥ ¾ÖÇø®ÄÉÀÌ¼Ç ÀÎÁõ¿¡ À¯¸®Çϸç, À§¿¡¼­ ¼³¸íÇÑ ÄÉÀ̽º¿Í °°ÀÌ À¥À» ÅëÇؼ­ Redirect ÇÏ´Â ¹æ½ÄÀÌ´Ù.
  • Implicit ¹æ½Ä - ÀÚ¹Ù½ºÅ©¸³Æ® ±â¹ÝÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀ̳ª ¸ð¹ÙÀÏ ¾ÖÇø®ÄÉÀÌ¼Ç Ã³·³ ¼­¹ö ¹é¿£µå°¡ ¾ø´Â °æ¿ì »ç¿ëÇÑ´Ù.
  • Resource Owner password credential ¹æ½Ä - ÀÎÁõÀ» ¿äûÇϴ Ŭ¶óÀ̾ðÆ®¿¡¼­ Á÷Á¢ ID¿Í PASSWD¸¦ º¸³»´Â ¹æ½ÄÀ¸·Î, (ÀÌ °æ¿ì À§ÀÇ ¹æ½Äµé°ú ´Ù¸£°Ô ¼­ºñ½º Á¦°øÀÚÀÇ ·Î±×ÀÎâÀ¸·Î ¸®´ÙÀÌ·º¼ÇÀÌ ÇÊ¿ä ¾ø´Ù.) Ŭ¶óÀ̾ðÆ®°¡ Á÷Á¢ ID,PASSWD¸¦ ¹Þ±â ¶§¹®¿¡, Ŭ¶óÀ̾ðÆ®¿¡ »ç¿ëÀÚÀÇ ºñ¹Ð¹øÈ£°¡ ³ëÃâµÉ ¼ö À־ ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®¸¦ °°Àº ȸ»ç¿¡¼­ Á¦ÀÛÇÑ °æ¿ì³ª, »ç¿ëÀÚÀÇ Á¤º¸¸¦ °øÀ¯Çصµ µÇ´Â 1¡¯st party ÆÄÆ®³Êµî°ú °°Àº °æ¿ì¿¡ »ç¿ëÇÑ´Ù.
  • Client Credential ¹æ½Ä - ÀϹÝÀûÀÎ ¾ÖÇø®ÄÉÀÌ¼Ç Access¿¡ »ç¿ëÇÑ´Ù.

ÀϹÝÀûÀ¸·Î API¸¦ 3¡¯rd party¿¡ Á¦°øÇÒ °æ¿ì¿¡´Â Authorization Code ¹æ½ÄÀ», ÀÚ»çÀÇ API¸¦ Àڻ糪 1¡¯st party ÆÄÆ®³Ê¸¸ »ç¿ëÇÒ °æ¿ì¿¡´Â Resource Owner password credential ¹æ½ÄÀÌ ÁÁ´Ù.

Mutual SSL

°¡Àå °­·ÂÇÑ ÀÎÁõ ¹æ¹ýÀ¸·Î,Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°¡ °¢ÀÚ ÀÎÁõ¼­¸¦ °¡Áö°í »óÈ£ ÀÎÁõÇÏ´Â ¹æ½ÄÀÌ´Ù. ¾ç¹æÇâ(2-way)SSL À̶ó°íµµ ÇÑ´Ù. ÀÌ °æ¿ì¿¡´Â Ŭ¶óÀ̾ðÆ®ÀÇ ÀÎÁõ¼­(Certificate)¸¦ ¼­¹ö¿¡°Ô ¾ÈÀüÇÏ°Ô Àü¼ÛÇÒ ¼ö ÀÖ´Â ¸ÞÄ¿´ÏÁòÀÌ ÇÊ¿äÇÏ´Ù. Ŭ¶óÀ̾ðÆ®°¡ Á¢¼ÓÇßÀ»¶§, Certificate¸¦ ³×Æ®¿öÅ©¸¦ ÅëÇؼ­ Àü¼ÛÇÏ°í, ¼­¹ö´Â ÀÌ ÀÎÁõ¼­°¡ °øÀÎµÈ ÀÎÁõ¼­ÀÎÁö¸¦ È®ÀÎÇÏ´Â ¹æ¹ýµµ ÀÖ°í, ³»Áö´Â ¼­¹öÀÇ Admin ConsoleµîÀ» ÅëÇؼ­ Ŭ¶óÀ̾ðÆ®°¡ »ç¿ëÇÏ´Â ÀÎÁõ¼­ ÀÚü¸¦ ¾÷·Îµå Çسõ´Â ¹æ¹ýµî ´Ù¾çÇÑ ¹æ¹ýÀÌ ÀÖ´Ù.
Mutual SSLÀº ¾çÂÊ¿¡ ÀÎÁõ¼­¸¦ »ç¿ëÇϱ⠶§¹®¿¡, Man in the middle attackÀÌ ºÒ°¡´ÉÇÏ°í, PacketÀ» snippingÇؼ­ º¸´Â °Í Á¶Â÷µµ ºÒ°¡´É ÇÏ´Ù. (´ë½Å ±¸ÇöÀÌ ´Ù¼Ò ±î´Ù·Ó´Ù.)

WhiteList ¹æ½Ä

¼­¹ö°£ÀÇ Åë½Å¿¡¼­´Â °¡Àå °£´ÜÇÏ°Ô ÇÒ ¼ö ÀÖ´Â ¹æ½ÄÀÌ ¼­¹ö°¡ API È£ÃâÀ» Çã¿ëÇÒ ¼ö ÀÖ´Â IP ¸ñ·ÏÀ» À¯ÁöÇÏ´Â ¹æ¹ýÀÌ´Ù. (WhiteList ¹æ½Ä). ´Ù¸¥ IP¿¡¼­ µé¾î¿À´Â API È£ÃâÀÇ °æ¿ì ¹ÞÁö ¾Ê´Â ¹æ¹ýÀ¸·Î, °¡Àå ±¸ÇöÀÌ °£´ÜÇÏ´Ù. ¹æÈ­º®À̳ª Reverse proxy ¼³Á¤µîÀ¸·Îµµ °¡´ÉÇÏ°í, ÇÊ¿äÇÏ´Ù¸é, VPN (Virtual Private Network)µîÀ» ÀÌ¿ëÇÒ ¼ö µµ ÀÖ´Ù.

ÇÁ·ÎÅäÄÝ ·¹º§ ¾Ïȣȭ

HTTP Åë½Å ÇÁ·ÎÅäÄÝ ÀÚü¸¦ ¾Ïȣȭ ÇÏ´Â ¹æ½ÄÀε¥, SSLÀ» ÀÌ¿ëÇÑ HTTPS°¡ ´ëÇ¥ÀûÀÎ °æ¿ìÀÌ´Ù. API µðÀÚÀο¡¼­ HTTPS´Â ¹Ýµå½Ã Àû¿ëÇÏ´Â °ÍÀ» ±ÇÀåÇÑ´Ù.
HTTPS´Â ¾Õ¿¡¼­µµ Àá±ñ ¾ð±ÞÇßµíÀÌ Man in the middle attack¿¡ Ãë¾àÇѵ¥ Man in the middle attackÀÇ ±âº»ÀûÀÎ ¸ÞÄ¿´ÏÁòÀº ¼­¹ö¿¡¼­ º¸³½ ÀÎÁõ¼­¸¦ ¹Ù²ãÄ¡±â Çؼ­, Ŭ¶óÀ̾ðÆ®·Î º¸³»´Â ¹æ½ÄÀ» ÀÌ¿ëÇÑ´Ù. (http://en.wikipedia.org/wiki/Man-in-the-middle_attack)
°¡´ÉÇϸé, ÀÎÁõ¼­ üũ ·ÎÁ÷À» Ŭ¶óÀ̾ðÆ®¿¡ µÎ´Â °ÍÀÌ ÁÁ´Ù. ÀÎÁõ¼­°¡ °øÀÎµÈ ÀÎÁõ¼­ÀÎÁö, (¶Ç´Â ±× ¼­¹öÀÇ ÀÎÁõ¼­°¡ ¸Â´ÂÁö¸¦ IssuerµîÀ» ÅëÇؼ­ È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÎÁõ¼­¿¡ ÀÖ´Â ³»¿ëµéÀº ±âº»ÀûÀ¸·Î Áß°£¿¡ ÇØÄ¿°¡ ¹Ù²Ü ¼ö ´Ù ¾ø´Ù. SigningÀÌ µÇ¾îÀֱ⠶§¹®¿¡, ³»¿ëÀ» ¹Ù²Ù¸é SingingµÈ Signature°¡ ¸ÂÁö ¾Ê´Â´Ù.) attack

¸Þ¼¼Áö ·¹º§ ¾Ïȣȭ

´ÙÀ½À¸·Î JSON°ú °°Àº ¸Þ¼¼Áö ÀÚü¸¦ ¾ÏȣȭÇÒ ¼ö Àִµ¥, ¾Õ¼­ ¼³¸íÇصíÀÌ SSLÀ» »ç¿ëÇÏ´õ¶óµµ, Áß°£¿¡ ÀÎÁõ¼­¸¦ ¹Ù²ã Ä¡´Â µîÀÇ ÇàÀ§¸¦ ÅëÇؼ­ ÆÐŶÀ» ¿­¾îº¼ °æ¿ì, ¸Þ¼¼Áö ³»¿ëÀ» ³ëÃâµÉ °¡´É¼ºÀÌ Àֱ⠶§¹®¿¡ À̸¦ ¹æÁö Çϱâ À§Çؼ­, Áß¿äÇÑ ¸Þ¼¼Áö´Â ¾ÏȣȭÇÏ´Â °ÍÀ» ±ÇÀåÇÑ´Ù.
À̶§ Àüü ¸Þ¼¼Áö¸¦ ¾Ïȣȭ ÇÏ´Â °ÍÀº ºñÈ¿À²ÀûÀ̸ç ƯÁ¤ ÇʵåÀÇ °ª¸¸ ÇÊ¿ä¿¡ µû¶ó¼­ ¾Ïȣȭ¸¦ ÇÏ´Â °ÍÀÌ ÁÁ´Ù.

¹«°á¼º °ü¸® (HMAC)

¸Þ¼¼ÁöÀÇ ¹«°á¼º º¸ÀåÀ̶õ, Áß°£¿¡ ÇØÄ¿¿¡ ÀÇÇؼ­ ¸Þ¼¼Áö°¡ º¯°æÇÒ ¼ö ¾øµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ±âº»ÀûÀÎ ¿ø¸®´Â ¸Þ¼¼Áö¿¡ ´ëÇÑ Çؽ¬°ªÀ» °è»êÇؼ­, º¸³»¼­, ¹Þ´Â ÂÊ¿¡¼­ ¹ÞÀº ¸Þ¼¼Áö¸¦ °¡Áö°í ¶È°°Àº ¾Ë°í¸®ÁòÀ¸·Î Çؽ¬¸¦ »ý¼ºÇÑÈÄ, º¸³»¿Â Çؽ¬°ª°ú ºñ±³ÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. ¸¸¾à¿¡ ¸Þ¼¼Áö°¡ º¯Á¶°¡ µÇ¾ú´Ù¸é,Çؽ¬°ªÀÌ ÀÏÄ¡ÇÏÁö ¾Ê±â ¶§¹®¿¡ ¸Þ¼¼Áö º¯Á¶ ¿©ºÎ¸¦ ÆľÇÇÒ ¼ö ÀÖ´Ù. ÀÚ¼¼ÇÑ ¼³¸í°ú ±¸Çö ¹æ¹ýÀº http://bcho.tistory.com/807¸¦ Âü°íÇϱ⠹ٶõ´Ù.

Áö±Ý±îÁö °£·«ÇÏ°Ô ³ª¸¶ REST API ¼³°è ¹æ½Ä¿¡ ´ëÇؼ­ ¾Ë¾Æº¸¾Ò´Ù.
ÀÚ¼¼ÇÑ ÀÚ·áµéÀº ¾Æ·¡ Âü°í ÀÚ·áµéÀº Âü°íÇϱ⠹ٶõ´Ù.

Âü°í : http://info.apigee.com/Portals/62317/docs/web%20api.pdf
Âü°í : APICract Google groups https://groups.google.com/forum/?fromgroups#!topic/api-craft/
Âü°í : ¸¶Æ¾ÆÄ¿ï·¯ÀÇ ¡®Glory of REST ÇâÇÑ ´Ü°èµé¡¯ http://jinson.tistory.com/190


»õ·Î¿î ¹®¼­°¡ ¾÷µ¥ÀÌÆ® µÇ¾ú½À´Ï´Ù.

REST API ÀÌÇØ¿Í ¼³°è - #1 °³³ä Àâ±â http://bcho.tistory.com/953

REST API ÀÌÇØ¿Í ¼³°è - #2 µðÀÚÀÎ °¡ÀÌµå  http://bcho.tistory.com/954

REST API ÀÌÇØ¿Í ¼³°è - #3 º¸¾È °¡ÀÌµå  http://bcho.tistory.com/955



Ãâó: http://bcho.tistory.com/category/¾ÆÅ°ÅØÃÄ /WEB 2.0 [Á¶´ëÇùÀÇ ºí·Î±×]