Microservice Architecture์์ ์ฌ์ฉํ๋ฉฐ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ End Point๋ฅผ ํตํฉํ๋ ์๋ฒ์ด๋ค.
API Gateway์์๋ Authentication, Monitoring, load balancing, security ๋ฑ์ ์ญํ ์ ํ๋ค.
ํด๋ผ์ด์ธํธ์ ์ ์ฅ์์๋ ํฌํธ๋ฒํธ๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅธ ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ ์ผ์ ์ฐธ์ผ๋ก ๋ฒ๊ฑฐ๋กญ๋ค. ์ด๋ฅผ ํ๋๋ก ์ฎ์ด์ API Gateway์์ ์ฒ๋ฆฌํด์ค๋ค. ( ์๋น์ค์ ์๋ํฌ์ธํธ ๋์ API Gateway๋ก ์์ฒญํ๋ค. )
- Netflix์ Zuul
- AWS์ API gateway
- Kong
- API Umbrella
- tyk.io
- Netfilx์ zuul
- JAVA ์ธ์ด๋ก ๋์ด์๋ค.
- API Gateway์์ ๊ถํ ์ฌ๋ถ์ ์๋น์ค ์๋ฒ๋ก์ ๋ผ์ฐํ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ ์์ ์ด์๊ธฐ ๋๋ฌธ์ ์์ ์ ๋ ํผ๋ฐ์ค๊ฐ ๋ง์ ๊ฒ์ ์ ํํ๋ค.
- Netflix์ฌ์ ๊น๋ํ Blog ์ ๋ฆฌ ๋ฐ GitHub ๊พธ์คํ Update
- ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง ์ฐพ์๋ดค์ ๋ ์ดํดํ๊ธฐ๋ ์ฌ์ ๊ณ PreFilter๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
-
Zuul Filter์ Pre Filter๋ฅผ ์ฌ์ฉํ์ฌ header์ token์ด ์กด์ฌํ๋ฉด ๋ง๋ฃ, ๋ณ์กฐ ์ฌ๋ถ ํ์ ํ๋ค.
-
token์ ๋ด๊ฒจ์๋ user์ email, nickname, userIdx๋ฅผ decodeํ ํ, header์ ํฌํจํ์ฌ ๋ณด๋ธ๋ค.
- ์ด์
๊ฑฐ์ ๋ชจ๋ ์๋น์ค ์๋ฒ์์ ์ ์ ์ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด token์ด ํ์ํ๋ค. ๊ฐ ์๋น์ค ์๋ฒ๋ง๋ค token์ ๊ฐ์ decodeํ ํ ์ ์ ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค. API Gateway์์ token์ decodeํด์ header์ ์ถ๊ฐํ๋ฉด ๋ค๋ฅธ ์๋ฒ์์ ๋์ผํ ์ฝ๋๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค. - header์ ๋ด์์ ๊ฐ๋ฉด ์ ์ ์ ๊ฐ์ธ์ ๋ณด์ ๋ํ ๋ณด์ ์ด์๋ ์๋?
- ๋ชจ๋ ์๋น์ค๋ API Gateway๋ฅผ ๊ฑฐ์ณ์ ๋ค์ด์์ผํ๊ณ , ๊ทธ ๋ค์ ์๋ ์๋ฒ๋ค์ ํ๋์ ํด๋ผ์ฐ๋ ์์ ์๊ธฐ ๋๋ฌธ์ ๋ด๋ถ๋ง ์ฌ์ด์ ๋ฐ์ดํฐ ๊ตํ์ด๊ธฐ ๋๋ฌธ์ ๋ณด์์ด์๋ ์์ ๊ฒ์ด๋ผ ํ๋จ๋๋ค.
- token์ ๋ณด์ ์ด์๊ฐ ์ผ์ด๋ ๋งํ ์ ๋ณด๋ฅผ ๋ฃ๋ ๊ฒ ์์ฒด๋ ๋ง์ด ์๋๋ค๊ณ ์๊ฐํ๋ค. ( ์ธ์ ๋ ํ์ทจ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ )
- ์ด์
-
Zuul์ด ๊ฐ์ง๊ณ ์๋ ๋ก๋ ๋ฐธ๋ฐ์ฑ, ๋ฐ์ดํฐ ํต๊ณ ๋ฑ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์์๋ค.
- token์ ๋ด๊ฒจ์๋ ์ ๋ณด๋ค์ ํค๋์ ์ถ๊ฐํ๋ฉด์ "x-forward-userIdx"๋ผ๊ณ ๋ช
๋ช
ํด๋์ ์์ด์ null๊ฐ์ด ๋ค์ด๊ฐ๋ค.
- Request header ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณด์๋๋ฐ "x-forward-useridx"๋ผ๊ณ ์ ํ์๋ค.
- ์ด๋ผ? ๋ ๋ถ๋ช
userIdx๋ผ๊ณ ์ ์๋๋ฐ ์ useridx๋ผ๊ณ ์ ํ์์ง?ํด์ ์ฐพ์๋ณด์๋๋ HTTP ํค๋๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ค๊ณ ํ๋ค.
๊ทธ๋์ userIdx -> useridx๋ผ๊ณ ์ ๊ณ ํ ์คํธ๋ฅผ ํด๋ณด์๋ค. ํ์ง๋ง, ์ฌ์ ํ null๊ฐ!! - ์ฌ์ค ๋ฌธ์ ๋ header์ ์์ง ์์๋ค.
- token์ useridx๊ฐ์ long์ผ๋ก ์ง์ด๋ฃ์๋๋ฐ decodeํ ๋๋ string์ผ๋ก ๋นผ๋ด๊ณ ์์๋ ๊ฒ! long์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ฐ๋ก ํด๊ฒฐ๋์๋ค.
- ++ userIdx, useridx ๋ผ๊ณ ์ ์ด๋ ๊ฐ์ ์ ์์ ์ผ๋ก ์ ๋ค์ด๊ฐ๊ณ ๋นผ๋ผ ์ ์๋ค.
- API Gateway์์ ZuulException ์ด ๋ด๋ค.
- ์ํฉ : Auth์ ํ์๊ฐ์
์, ์ด๋ฉ์ผ ์ธ์ฆ์ฝ๋ ํ์ธ๊น์ง ์๋ฃํ ํ, ๋ ์์ฒญ์ ํ์ ๊ฒฝ์ฐ "์ด๋ฏธ ์ธ์ฆํ๋ ์ด๋ ฅ์ด ์์ต๋๋ค" ์ด๋ฐ ์์ ๋ฉ์ธ์ง๊ฐ ๊ฐ๋๋ก ์ฒ๋ฆฌํด๋์๋ค.
์ด ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ ๊ฒ์ ์ค๋ฅ? ๋๋์ ์๋์๊ณ ๊ตณ์ด ๊ท์ฐฎ์ ์ผ์ 2๋ฒ ํ ํ์๊ฐ ์๋ค๋ ๋ฉ์ธ์ง๋ก ๋ณด๋ด๊ธฐ ์ํจ์ด์๋ค.
๊ทธ๋์ StatusCode๋ฅผ 100๋ฒ HTTP.Continue๋ก ์คฌ๋ค. Auth์์๋ ์ ๋์ด๊ฐ๋๋ฐ, API Gateway์์ Error Filter๋ก ๋์ด๊ฐ์ ์๋ฌ๋ฅผ ๋ด๋ฑ์๋ค. - ์ด์ ๊ฐ ๋ญ๊น??
- ์ํฉ : Auth์ ํ์๊ฐ์
์, ์ด๋ฉ์ผ ์ธ์ฆ์ฝ๋ ํ์ธ๊น์ง ์๋ฃํ ํ, ๋ ์์ฒญ์ ํ์ ๊ฒฝ์ฐ "์ด๋ฏธ ์ธ์ฆํ๋ ์ด๋ ฅ์ด ์์ต๋๋ค" ์ด๋ฐ ์์ ๋ฉ์ธ์ง๊ฐ ๊ฐ๋๋ก ์ฒ๋ฆฌํด๋์๋ค.
- HTTP header์ ๋๋ค์์ ๋ฃ๊ณ ์ถ๋ค!
- HTTP header ํ์ค์๋ ISO-8859-1 character๋ฅผ ์ ์ธํ ๋ค๋ฅธ charset์ ์ง์ํ์ง ์๋๋ค.
- (HTTP) messages cannot carry characters outside the ISO-8859-1 character set.
- HTTP header์ ISO-8859-1 character๋ฅผ ์ ์ธํ ๋ค๋ฅธ ๋ฌธ์๋ฅผ ๋ฃ๊ธฐ ์ํด์๋ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ ๊ณผ์ ์ ๊ฑฐ์ณ์ผํ๋ค.
-
Pre Filter
- ์ค์ ์๋น์ค ์๋ฒ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ token์ ๋ง๋ฃ, ๋ณ์กฐ ์ฌ๋ถ ๋ฑ์ ํ์ธํ๋ Filter
-
Routing Filter
- Http๋ก ๋ค์ด์จ ์์ฒญ์ ํด๋น ์๋น์ค ์๋ฒ์๊ฒ ๋ณด๋ด์ค๋ค.
-
POST Filter
- ์๋น์ค ์๋ฒ์์ ์๋ต์ ๋ฐ์์จ ํ Response์ ์ถ๊ฐํ ๊ฒ์ด ์๋ค๋ฉด ์ถ๊ฐํ๋ ๊ณณ
-
Error Filter
- ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ Filter
dependencies {
implementation 'org.springframework boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
//zuul
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-zuul'
//lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//jwt
implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.7.0'
implementation 'com.auth0:java-jwt:3.4.0'
//gson
compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
}
๐ ์ฐธ๊ณ ๋ฌธ์/์ถ์ฒ

