SPRING
2018.09.23 / 16:15

Spring boot¿¡¼­ Ä¿½ºÅÒ ¾î³ëÅ×À̼ÇÀ» È°¿ëÇÑ Jwt °ËÁõ

hangawee
Ãßõ ¼ö 212

Ä¿½ºÅÒ ¾î³ëÅ×À̼ÇÀÇ È°¿ë

Á¦°¡ ÁøÇàÇÏ´Â ÇÁ·ÎÁ§Æ®¿¡¼­´Â ¾Èµå·ÎÀ̵å¿Í Spring Boot ¼­¹öÀÇ ¼­·Î Åë½ÅÀ» ÁøÇàÇϸ鼭 Jwt¸¦ ÀÌ¿ëÇÏ¿© »ç¿ëÀÚ ÀÎÁõÀ» ÁøÇàÇÏ¿´½À´Ï´Ù.
À̹ø Æ÷½ºÆÿ¡¼­´Â JwtÀÎÁõ¿¡ ´ëÇÑ ºÎºÐ º¸´Ù´Â,
Ä¿½ºÅÒ ¾î³ëÅ×À̼ÇÀ» ¿Ö ¾²°Ô µÇ¾ú´ÂÁö¿Í ´õºÒ¾î ¾î¶²½ÄÀ¸·Î Ä¿½ºÅÒ ¾î³ëÅ×À̼ÇÀ» È°¿ëÇÏ¿´´ÂÁö¿¡ ´ëÇØ ÀÛ¼ºÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù.


¿Ö Ä¿½ºÅÒ ¾î³ëÅ×À̼ÇÀ» ¾²°Ô µÇ¾ú´Â°¡?

¼­¹ö¿Í ¸ð¹ÙÀÏ¿¡¼­ »ç¿ëÀÚ ÀÎÁõÀº jwt¸¦ È°¿ëÇÏ°í ÀÖ½À´Ï´Ù.
ÄÁÆ®·Ñ·¯¿¡ ÁøÀÔÇÒ ¶§ Header¿¡ ÀÖ´Â jwt¸¦ ¹Þ¾Æ¼­ ÇØ´ç jwt¸¦ °ËÁõÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù.
óÀ½¿¡´Â ·ÎÁ÷À» ³Ê¹« º¹ÀâÇÏ°Ô Â®½À´Ï´Ù.

ÃÊâ±â¿¡ °³¹ßµÈ ÀϺΠÄڵ带 º¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.

1
2
return isProblemJsonResultCode(securityService.veryfiyHeaderInJwt(request))
.orElseGet(() -> {...})

À§ÀÇ ÀÛÀº Äڵ忡¼­¸¸ ºÁµµ jwt¸¦ °ËÁõÇÏ´Â ·ÎÁ÷ ÀÚüµµ ºÒºÐ¸íÇÏ°í, ¶÷´Ù½ÄÀ» À߸ø ¾´ °Íµµ º¸À̳׿ä.
ÄÁÆ®·Ñ·¯¿¡ ÁøÀÔÇÒ ¶§¸¶´Ù Àú·±½ÄÀ¸·Î ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù¸é Äڵ尡 Á¤¸» ÁöÀúºÐÇØÁú °ÍÀ¸·Îµµ ¿¹»óµÇ³×¿ä. (½ÇÁ¦·Îµµ ±×·¨½À´Ï´Ù¡¦)

±×·¡¼­ ÀÌ ºÎºÐÀ» ¾î¶»°Ô °³¼±À» ÇÒ±î ÇÏ´Ù°¡ ÀÎÅͼÁÅ͸¦ È°¿ëÇϱâ·Î ÇÏ¿´½À´Ï´Ù.
ƯÁ¤ url¿¡ Á¢±ÙÇÏ°Ô µÈ´Ù¸é ÀÎÅͼÁÅÍ¿¡¼­ ó¸®ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÏ´Â °ÍÀ» »ý°¢ÇÏ¿´½À´Ï´Ù.
±×·±µ¥ ÀÌ ºÎºÐ¿¡¼­´Â ¾Æ·¡¿Í °°Àº °í¹Î°Å¸®¿¡ ´ëÇØ »ý°¢ÇÏ°Ô µÇ¾ú½À´Ï´Ù.

  1. ƯÁ¤ Rest api È£Ã⠽ÿ¡´Â jwt °ËÁõÀÌ ÇÊ¿äÇÏÁö ¾Ê´Ù.
  2. ¼­¹ö°¡ Rest api only°¡ ¾Æ´Ï¶ó¼­ ¸î °¡Áö ´Ù¸¥ url È£Ãâµµ °°ÀÌ ¾²°Ô µÊ

1¹øÀÇ °æ¿ì °ËÁõÀ» ¾ÈÇÏ´Â api°¡ ÀûÀº ¼ýÀÚ´Â ¾Æ´Ï¶ó¼­ excludePathPatterns À» ÀÏÀÏÈ÷ Àû¿ëÇϱ⿣ ÀÎÅͼÁÅÍ°¡ ±æ¾îÁú °Í °°¾Ò½À´Ï´Ù.
2¹øÀÇ °æ¿ì ±âÁ¸¿¡ °³¹ßÀÌ µÈ ¼­¹ö¿¡ Rest api¸¦ ºÙÀÌ´Â ¹æ½ÄÀ̾(»ç½Ç ¼³°èÃøµµ À߸øµÇ¾î ÀÖÁö¸¸..) url ¾Õ ºÎºÐÀÌ °ãÄ¡´Â ¹®Á¦µµ ÀÖ¾ú½À´Ï´Ù.

±×·¡¼­ ÀÌ ºÎºÐÀ» ÇØ°áÇÏ°Ô µÈ °ÍÀÌ Ä¿½ºÅÒ ¾î³ëÅ×À̼ÇÀ̾ú½À´Ï´Ù.
ÄÁÆ®·Ñ·¯¿¡¼­ jwt °ËÁõÀ» ÁøÇàÇØ¾ß ÇÏ´Â ºÎºÐ¿¡´Â @CheckJwt ¿Í °°Àº ¾î³ëÅ×À̼ÇÀ» ºÙ¿©¼­ ±¸ºÐÀ» ÇÏ°Ô ÇÏ´Â ¹æ½ÄÀ» »ý°¢ÇÏ¿´½À´Ï´Ù.


¾î¶² ½ÄÀ¸·Î È°¿ëÀ» ÇÏ¿´´Â°¡?

ÀÏ´Ü ¾î³ëÅ×À̼ǰú Ä¿½ºÅÒ ¾î³ëÅ×À̼ǿ¡ ´ëÇÑ ÀÌÇØ°¡ ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ÁøÇàÇÏ°Ú½À´Ï´Ù.

¸¸¾à µÎ °¡Áö¿¡ ´ëÇØ ¸ð¸£½Å´Ù¸é ¾Æ·¡ÀÇ Æ÷½ºÆÃÀ» Âü°íÇØÁÖ¼¼¿ä.
Java¿¡¼­ ¾î³ëÅ×À̼Ç(Annotation)À̶õ?
Ä¿½ºÅÒ ¾î³ëÅ×ÀÌ¼Ç ¸¸µé°í »ç¿ëÇϱâ

  1. ÀÎÅͼÁÅ͸¦ Çϳª ¸¸µç´Ù.

¸ÕÀú ÀÎÅͼÁÅ͸¦ Çϳª ¸¸µé¾îÁÝ´Ï´Ù.

1
2
3
4
5
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckJwt {
boolean needCheck() default true; //üũ°¡ ÇÊ¿äÇÑ °æ¿ìÀÇ ¿©ºÎ (±âº» °ª : °Ë»ç)
}

ÀÌ·±½ÄÀ¸·Î ¸¸µé¾îÁÝ´Ï´Ù.

  1. ¼±¾ðµÈ ÀÎÅͼÁ¿¡¼­ ¾î³ëÅ×ÀÌ¼Ç Ã³¸®¸¦ ÁøÇà

Àú°°Àº °æ¿ì ÄÁÆ®·Ñ·¯ ÁøÀÔÇϱâ Àü¿¡ jwt °ËÁõÀ» ó¸®Çϱâ À§Çؼ­ preHandle¿¡¼­ 󸮸¦ ÁøÇàÇÏ¿´½À´Ï´Ù.

1
2
3
4
5
6
7
8
9
HandlerMethod method = (HandlerMethod)handler;
CheckJwt checkJwt = method.getMethodAnnotation(CheckJwt.class);

if (checkJwt == null || checkJwt.needCheck()==false) { return true; }//°Ë»ç¸¦ ÇÒ ÇÊ¿ä°¡ ¾ø´Â ºÎºÐ
else { //¼¼¼Ç üũ °Ë»ç
return Optional.ofNullable(request.getHeader(HttpHeaders.AUTHORIZATION))
.map(token -> jwtService.veryfiyJwt_new(token))
.orElseThrow(JwtNotFoundException::new); //ÅäÅ«ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì
}

preHandleÀÇ Àü´ÞÀÎÀÚ Áß handler ÆĶó¸ÞÅÍ´Â ÀÎÅͼÁÅÍ¿¡¼­ Çڵ鷯 ¸ÅÇÎÀÌ Ã£¾Æ ÁØ ÄÁÆ®·Ñ·¯ÀÇ °´Ã¼¸¦ ¹ÝȯÇÕ´Ï´Ù.
±×·¡¼­ ù¹ø ° ÁÙ¿¡¼­ method¿¡´Â È£ÃâµÈ ÄÁÆ®·Ñ·¯ÀÇ °´Ã¼°¡ ´ã°ÜÁ® ÀÖ°í, µÎ¹ø° ÁÙ¿¡¼­ @CheckJwt ¾î³ëÅ×À̼ÇÀ» ã½À´Ï´Ù.
¸¸¾à @checkJwt°¡ ¼±¾ðÀÌ ¾ÈµÇ¾î Àְųª needCheck°¡ falseÀÏ °æ¿ì °Ë»ç¸¦ ÁøÇàÇÏÁö ¾Ê°í, ±× ¿Ü¿¡´Â °Ë»ç¸¦ ÁøÇàÇÏ°Ô µË´Ï´Ù.

  1. ¼±¾ð ¹× »ç¿ë

ÀÌÁ¦ @CheckJwt´Â ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÏ°Ô µÉ ¼ö ÀÖ½À´Ï´Ù.

1
2
3
4
@CheckJwt
@ResponseBody
@GetMapping("list/{hour}/{level}")
public JsonResultVo getMachineWarning(HttpServletRequest request, @PathVariable("hour") String hour, @PathVariable("level") String level) { ... }

Á¤¸®

ÀÚ¹ÙÀÇ Ä¿½ºÅÒ ¾î³ëÅ×À̼ÇÀ» È°¿ëÇÑ´Ù¸é Á¤¸» È¿°úÀûÀÎ ÄÚµå ¸®ÆåÅ丵À» ÁøÇàÇÒ ¼ö ÀÖÀ» »Ó´õ·¯, ÄÚµåÀÇ ÀÌÇصµ°¡ Çâ»óµÇ´Â °Í °°½À´Ï´Ù.
´ÙÀ½¿¡´Â jwt¿¡ ´ëÇÑ °Í¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸´Â Æ÷½ºÆÃÀ» ÀÛ¼ºÇغ¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.