Programming Project ์ž‘์—…์‹ค/๋‚ด์šฉ ์ •๋ฆฌ

[์šฐ๋ฆฌ์ง‘ ๊ฐ€์กฑ ์ปค๋ฎค๋‹ˆํ‹ฐ ์›น ์„œ๋น„์Šค ํ”„๋กœ์ ํŠธ] ๊ธฐ์ˆ  ์ •๋ฆฌ - Spring Security ์ดˆ๊ธฐ ๊ตฌ์„ฑ

์ฃผ๋‹ˆ์“ฐ๐Ÿง‘‍๐Ÿ’ป 2021. 12. 21. 13:56
728x90
๋ฐ˜์‘ํ˜•

์šฐ๋ฆฌ ๊ฐ€์กฑ์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ์›น ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋จผ์ € Server ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์ฝ”๋”ฉ์„ ํ•˜๋ฉด์„œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด์„œ ๋‚˜์ค‘์— ์ฃผ๋‹ˆ ํ•˜๋ž‘๋„ ํ™•์ธํ•˜๊ณ , ์—ฌ๊ธฐ ์˜ค์‹  ์—ฌ๋Ÿฌ๋ถ„๋“ค๊ณผ๋„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ด์—์š”!

๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

 

 

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ Source Code๋Š” '์ฃผ๋‹ˆํ•˜๋ž‘ Git Hub'์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


 

๐Ÿ—‚ ๋ชฉ์ฐจ(INDEX)
       1.  
์ดˆ๊ธฐ๊ตฌ์„ฑ

       2. Spring Security ์ดˆ๊ธฐ ๊ตฌ์„ฑ

       3. Interceptor ์„ค์ •

.      4. ์ดˆ๊ธฐ Domain ์„ค์ •

 

 

 

 


 

 

๐Ÿš€ Package Tree

 

 

 

๐Ÿš€ CORS Filter

 

 

๋จผ์ € ์ด ์ฝ”๋“œ๋Š” CORS Filter๋ฅผ ๊ตฌํ˜„ํ•œ ๋’ค Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๊ฒƒ์ด์—์š”. ์ด ๋ฐฉ๋ฒ•์€ Spring MVC๊ฐ€ ์•„๋‹Œ Srping WEB์—๋งŒ ์˜์กดํ•˜๊ฑฐ๋‚˜, Security ์„ค์ • Level์—์„œ CORS๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ํ™•์ธํ•  ๋•Œ ์œ ์šฉํ•˜๊ธฐ์— ์‚ฌ์šฉํ•œ ๊ฒƒ์ด์—์š”.

13๋ฒˆ์งธ ์ค„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•˜์ž๋ฉด @Order๋Š” Spring Bean์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

Default Option์€ Ordered.LOWEST_PRECEDENCE์ด๊ณ , collection์— componenet๋ฅผ Spring 4.0์—์„œ๋ถ€ํ„ฐ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด์„œ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ˆœ์„œ๋ฅผ ์ •ํ•˜๋Š”๋ฐ, ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด์—์š”.

@Order์—๋Š” ์ƒ์ˆ˜๊ฐ’์„ ํ†ตํ•ด ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ฃผ๋‹ˆํ•˜๋ž‘์ด ์ค€ Ordered.HIGHEST_PRECEDENCE์˜ ์‹ค์ œ ์ƒ์ˆ˜๊ฐ’์€ -2147483648์œผ๋กœ ์ œ์ผ ๋จผ์ € ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ธ ๊ฒƒ์ด์—์š”.

@Order์— ๋Œ€ํ•ด์„œ๋Š” ์ด ๊ณณ์— ์ž์„ธํžˆ ์„ค๋ช…์„ ๋‹ฌ์•„ ๋†“๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

doFilterInternal()๋ฅผ override(์žฌ๊ตฌ์„ฑ)ํ•˜๊ณ , ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜์ธ response ์•ˆ์— SetHeader์— ๋Œ€ํ•ด ์„ค์ •์„ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ด๋ ‡๊ฒŒ ํ•œ ์ด์œ ๋Š” ๋ฐ”๋กœ Filter๋ฅผ ๋“ฑ๋กํ•˜์—ฌ CORS์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

์œ„์˜ ์›๋ฆฌ๋Š” ์‹ค์ œ ์š”์ฒญํ•˜๊ธฐ ์ „์— ์˜ˆ๋น„์š”์ฒญ(Preflight Request)๋ฅผ ํ†ตํ•ด ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ Domain, Method ๋“ฑ์„ ์‘๋‹ตํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

19๋ฒˆ์งธ ์ค„์€ Request์— Cookie, authorization Header๋“ค ๋˜๋Š” TLS Client ์ธ์ฆ์„œ ๋“ฑ์„ ๋‹ด์•„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—์š”. ์ด ๊ฒฝ์šฐ Access-Control-Allow-Origin, *๊ณผ ๊ฐ™์ด ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด Origin๊ฐ’์„ ์ง์ ‘ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•œ ๊ฒƒ์ด์—์š”.

Request์˜ Orgin Header๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ›์•„ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— '*' ๊ณผ ๊ฐ™์€ ์„ค์ •์ด๋ž๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์ฐจํ›„ ajax๋ฅผ ์•„๋ž˜ ์ฒ˜๋Ÿผ ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

$.ajax({
	url: 'http://hongga-community.com/hello',
    data: {
    	param_1 : '111'
        param_2 : '222'
    },
    type: 'GET'
    dataType : 'json',
    xhrFields: {
    	withCredentials: true
    },
    success: function(data) {
    	console.log(data);
    },
    error : function(e) {
    	console.log(e);
    }
});

 

์œ„์˜ xhrFilds์— withCredentials true๋Š” XMLHttpRequest๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, Cookie, authorization Header๋“ค TLS ์ธ์ฆ์„œ๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋œ๋‹ต๋‹ˆ๋‹ค.

 

 

๐Ÿš€ JwtUtil

    ๐Ÿ”ฝ Field Variable

๋จผ์ € ์ฃผ๋‹ˆํ•˜๋ž‘์€ JAVA์—์„œ ์•”ํ˜ธํ™” ๊ด€๋ จ Key๋ฅผ ์ œ๊ณตํ•˜๋Š” java.security.Key๋ฅผ static ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์ค€ ๊ฒƒ์ด์—์š”.

๊ทธ ๋‹ค์Œ์—๋Š” jwt์— ๋Œ€ํ•œ Log๋ฅผ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด slf4j๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„์ธ ๊ฒƒ์ด์—์š”.

Refresh Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์€ 2์ฃผ๋ฅผ ์ค˜์„œ ์ด์šฉ์ž๋“ค์˜ ํŽธ์˜์™€ ๋ณด์•ˆ์„ ์‹ ๊ฒฝ ์“ด๊ฒƒ์ด์—์š”.
Access Token์€ 1์‹œ๊ฐ„์„ ์ฃผ์—ˆ๋‹ต๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ 30๋ฒˆ์งธ ์ค„์— Method Body๋Š” ์ด ๋‚ด์šฉ์„ ์œ„ํ•ด ์ค€ ๊ฒƒ์ด์—์š”.

๊ทธ ์ „์— Hash Function์„ ์ž˜ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด ์ด ๊ณณ์„ ์ฐธ๊ณ  ํ•˜์‹œ๊ธฐ ๋ฐ”๋ผ๋Š” ๊ฒƒ์ด์—์š”.

HMAC-SHA ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฌธ์ž์—ด secret key ๋˜๋Š” ์ธ์ฝ”๋”ฉ๋œ byte array๋ฅผ ์‚ฌ์šฉํ•ด์„œ JWT์— ์„œ๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ signWith ๋ฉ”์†Œ๋“œ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  SecretKey ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

  • ์ธ์ฝ”๋”ฉ๋œ byte array:
SecretKey key = Keys.hmacShaKeyFor(encodedKeyBytes);
  • Base64 ์ธ์ฝ”๋ญ๋œ ๋ฌธ์ž์—ด
SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));
  • Base64URL ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด
SecretKey key = keys.hmacShakeyFor(Decoders.BASE64URL.decode(scretString));
  • ์ธ์ฝ”๋”ฉ ์•ˆ๋œ ๋ฌธ์ž์—ด(์˜ˆ password ๋ฌธ์ž์—ด)
SecretKey key = Keys.hmacShaKeyFor(secretString.getBytes(StandardCharsets.UTF_8));

secretString.getBytes()์‹œ์—๋Š” ํ•ญ์ƒ ์บ๋ฆญํ„ฐ์…‹์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋ฆฌ๊ณ  ์‹๋ณ„ํ• ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด pasword๋Š” ๊ฐ€๋Šฅํ•œ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๊ฐ€๋Šฅํ•˜๋ฉด ์•ˆ์ „ํ•œ ๋žœ๋คํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

    ๐Ÿ”ฝ  Method(createAccessToken / createRefreshToken / getClaim)

์ด ์นœ๊ตฌ๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ)๋กœ ์•ž์œผ๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋  Member Entity์˜ @Id๊ฐ’, DB๋กœ ๋งํ•˜์ž๋ฉด PK๊ฐ’์ด ๋  memberId์™€ member์˜ ๋“ฑ๊ธ‰์„ ํ™•์ธํ•˜๊ฒŒ ๋  memberGrade๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•œ ์ด์œ ๋Š” JWT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ถ๊ทน์ ์ธ ์ด์œ ๋Š” ์ด์šฉ์ž์— ๊ถŒํ•œ์„ ํ™•์ธํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์„œ๋น„์Šค ํ•˜๊ณ ์ž ํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•œ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์› ๋“ฑ๊ธ‰ ๊ฐ’์„ ๋ฐ›๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

JWT์˜ ๋งŒ๋ฃŒ ๋ฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„ ์„ค์ • ๋“ฑ์„ ์œ„ํ•ด Date()๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑ์„ ํ•ด์ค€ ๋’ค Jwts์˜ Builder Pattern์„ ํ†ตํ•ด ์„ค์ •์„ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ผ๋‹จ ๊ฐ„๋žตํ•˜๊ฒŒ JWT๋ž€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณผ๊นŒ ํ•ด์š”!

'Json Web Token'์˜ ์•ฝ์ž ์ด๋ฉฐ, 'Json format'์„ ์ด์šฉ ์›น์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—‘์„ธ์Šค ํ† ํฐ์„ ๋‹ค๋ฃจ๋Š” ํ‘œ์ค€์ธ ๊ฒƒ์ด์—์š”. JWT๋ฅผ ์ด์šฉ ์ ์ ˆํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ํ† ํฐ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

JWT๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

Part Description
Header - ์–ด๋–ค ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ์ธ์ง€.
- ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ• ์ง€.
Payload(Claims) - ์‹ค์ œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š”์ง€(์•”ํ˜ธํ™”๊ฐ€ ์•ˆ ๋˜์–ด ์žˆ์–ด ์›น์œผ๋กœ ๋…ธ์ถœํ•˜๋ฉด ์•ˆ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ๋Š” ์•ˆ๋จ.)
- ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

- Production์œผ๋กœ ์‚ฌ์šฉ ํ•  ์‹œ์—๋Š” ํ† ํฐ์ด ์–ธ์ œ๊นŒ์ง€ ์œ ํšจํ•œ์ง€ ๋‹ด๋Š” ๊ฒƒ์ด ์ข‹์Œ.
Signature - ๋ฐ์ดํ„ฐ์™€ ํ† ํฐ์ด ์œ„/๋ณ€์กฐ ๋˜์ง€ ์•Š์•˜์Œ ์ฆ๋ช….
- ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ํ•ด์‹ฑํ•˜๊ณ  ํ•ด์‹ฑํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™” ํ•ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„/๋ณ€์กฐ ๋˜์ง€ ์•Š์Œ ์ฆ๋ช….
- HMAC-SHAXXX ์‚ฌ์šฉ.
  (ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ ์œ„ํ•ด ๋น„๋ฐ€ํ‚ค ์ƒ์„ฑ์„ ํ•˜๋Š”๋ฐ, ๋น„๋ฐ€ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ ๋…ธ์ถœ์ด ๋˜์ง€ ์•Š๋„๋ก ์กฐ์‹ฌ!)

์œ„์˜ Json ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ƒฅ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Base64 URL Encoding ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

Cliaims ์ฆ‰, JWT์˜ Payload์— ํšŒ์› Table์˜ PK๊ฐ’์ด ๋  memberId์™€ ํšŒ์› ๋“ฑ๊ธ‰์ธ memberGrade๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ , Access Token ์ด๋ฆ„๊ฐ’์„ ๊ฐ™์ด ๋„ฃ์–ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

43๋ฒˆ์งธ ์ค„์—๋Š” JWT ๋ฐœ๊ธ‰ ์‹œ๊ฐ์˜ ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด ํ˜„์žฌ Server์˜ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„ฃ์–ด์ค€ ๊ฒƒ์ด์—์š”.

45๋ฒˆ์งธ ์ค„์—๋Š” JWT ๋งŒ๋ฃŒ ์‹œ๊ฐ์˜ ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด ํ˜„์žฌ Server ์‹œ๊ฐ„๊ณผ ๋ฐœ๊ธ‰ ์‹œ๊ฐ์„ ๋„ฃ์–ด์ฃผ๊ณ , ACCESS_VALID_TIME ๊ฐ’(60๋ถ„)์„ ๋„ฃ์–ด์„œ now.getTime() ์ฆ‰, ๋ฐœ๊ธ‰ ์‹œ๊ฐ์˜ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์™€์„œ ACCESS_VALID_TIME, 60๋ถ„์„ ๋”ํ•ด์„œ ์ƒˆ๋กœ์šด Date ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฐ’์„ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์œผ๋กœ ์„ค์ •ํ•œ ๊ฒƒ์ด์—์š”.

46๋ฒˆ์งธ ์ค„์€ ๋ณตํ˜ธํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Signature๋ฅผ ์„ค์ •ํ•œ ๊ฒƒ์ด์—์š”. Signature๋Š” Header์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’๊ณผ Payload์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’์„ ํ•ฉ์นœ ๋’ค์„œ๋ฒ„๋งŒ์ด ์•Œ๊ณ  ์žˆ๋Š” ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‰ฌ๋ฅผ ํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์—์š”.
signWith api๋Š” ํ•ด์‹ฑํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๋ฐ€ํ‚ค๋ฅผ ํ•„์š”๋กœํ•ฉ๋‹ˆ๋‹ค. key๊ฐ€ ๋น„๋ฐ€ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค!

 

๋ฐ˜์‘ํ˜•

 

Refresh Token ๋ฐœ๊ธ‰๋„ ์œ„ Access Token๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ƒ์„ฑํ•˜์ง€๋งŒ, ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ 2์ฃผ๋กœ ์„ค์ •ํ•œ ๊ฒƒ์ด์—์š”.
๊ทธ๋ž˜์•ผ ์ด์šฉ์ž์˜ ํž˜๋“  Login ์ž‘์—…์„ ์กฐ๊ธˆ์€ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋ฉด ํŽธ๋ฆฌ์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ํŽธ๋ฆฌ์„ฑ์„ ์˜ฌ๋ฆฐ๋‹ค๋ฉด ๋ณด์•ˆ์ด ๋–จ์–ด์ง€๋Š” ๊ฒƒ์ด์—์š”.
์ด ๋”œ๋ ˆ๋งˆ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ €ํฌ ๊ฐ€์กฑ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ์ด ์ •๋„ ๊ฐ’์ด ์ ์ ˆํ•˜๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ•œ ๊ฒƒ์ด์—์š”.

 

 

์ด๋ฒˆ Method๋Š” Token์˜ ๋งŒ๋ฃŒ ์ผ์‹œ์™€ ๋ณตํ˜ธํ™”๋ฅผ ํ™•์ธ ์ฆ‰! ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•œ Method์ธ ๊ฒƒ์ด์—์š”.

์œ„์—์„œ ์ƒ์„ฑ๋œ Token์„ ์ด์šฉ์ž๋Š” ๋ฐ›์•„์„œ Server์— ์ „๋‹ฌ์„ ํ•  ๊ฒƒ์ด๊ณ , Server๋Š” ํ•ด๋‹น Method๋ฅผ ํ†ตํ•ด ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ๊ฒƒ์ด์—์š”.

Exception์ด ํ„ฐ์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ Try - catch๋ฌธ์œผ๋กœ ๊ฐ์‹ธ๊ณ , JWT๋Š” String ์ฆ‰, ๋ฌธ์ž์—ด๋กœ ์ด๋ค„์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Jwts.paser๋ฅผ ํ†ตํ•ด Parsing์„ ํ•˜๊ณ , Token์„ ๋งŒ๋“ค ๋•Œ, ์‚ฌ์šฉํ–ˆ๋˜ key๋ฅผ ๊ฐ€์ง€๊ณ , setter๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๋“ค์–ด์˜จ Token์˜ SigningKey ์ฆ‰, Data์™€ Token ๋“ฑ์ด ์œ„ / ๋ณ€์กฐ ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , parseClaimsJws๋ฅผ ํ†ตํ•ด Token์„ Jws๋กœ Parsingํ•˜๋Š” ๊ฒƒ์ด์—์š”.
๋งˆ์ง€๋ง‰์œผ๋กœ getBody()๋ฅผ ์ด์šฉํ•ด์„œ ์•ž์—์„œ Token์— ์ €์žฅํ–ˆ๋˜ Data๋“ค์ด ๋‹ด๊ธด Claims (Payload)๋ฅผ ์–ป์–ด์˜จ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ๋ฐ? ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด? null์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

 

์œ„์™€ ๊ด€๋ จ๋œ JWT์— ๊ด€๋ จํ•œ ๋‚ด์šฉ์€ ์ด ๊ณณ์— ์ •๋ฆฌ ํ•ด ๋‘์—ˆ์–ด์š”! ์ฐธ๊ณ ๋กœ ์ด ๊ธ€์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ, ์ฃผ๋‹ˆํ•˜๋ž‘์ด ์ •๋ฆฌํ•œ ์ž๋ฃŒ ์ž…๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•