์ํฉ
์น์์ผ ์ฐ๊ฒฐ ํ ์คํธ๋ฅผ ํ๋ ์ค ํ๋ก ํธ์๋ ํ์์๊ฒ ์๋์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ฐ์๋ค.
์์ฒญ ํค๋์ ์ฟ ํค๊ฐ ์๋๋ฐ ์น์์ผ ์ฐ๊ฒฐ์ด ๋๊ณ , ์ฑํ ๋ฉ์ธ์ง๋ ์ ๋ณด๋ด์ง๋ค?
๋ฌด์จ ๋ง์ด์ง? ์น์์ผ์ ๊ธฐ๋ฐํ ์ฑํ ์ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์๋ง ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด ํ ํฐ์ ํตํ ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ์ด๋ ํ ํฐ์ ์ฟ ํค์ ๋ด๊ฒจ ์์ฒญ ํค๋์ ์ค๋ฆฐ๋ค.
๊ทธ๋ฐ๋ฐ, ํด๋ผ์ด์ธํธ ์ธก์์ ์น์์ผ ์ฐ๊ฒฐ์ ํ๋ ์ค ์ฟ ํค๊ฐ ์๋๋ฐ ์น์์ผ ์ฐ๊ฒฐ์ด ์ ๋๊ณ , ๋ฉ์์ง๋ ์ ๋ณด๋ด์ง๋ค๊ณ ํ๋ค.
ํ๋ก์ ํธ์ ์น์์ผ ์ธ์ฆ ํ๋ฆ

ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ์น์์ผ ์ฐ๊ฒฐ ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฒ์ HandshakeInterceptor๊ฐ ์์ฒญ์ ๋ด๊ฒจ์๋ ์ฟ ํค๋ฅผ ๊บผ๋ด์ด ํ ํฐ์ผ๋ก ์ฌ์ฉ์ ์ธ์ฆ์ ์งํํ๋ค. ํ ํฐ์ด ์ ํจํ์ง ์๊ฑฐ๋, ๋ง๋ฃ๋ ํ ํฐ์ด๋ผ๋ฉด ์์ธ๋ฅผ ๋ฐํํ๊ณ , ํ ํฐ์ด ์ ํจํ๋ค๋ฉด ๊ณ์ ์งํํ๋ค.
์ฆ, ํ ํฐ์ด ์๋ค๋ฉด ์์ธ๊ฐ ๋ฐ์ํด์ผ ์ ์์ด๋ค. ๊ทธ๋ฐ๋ฐ ์์ ๋ฉ์ธ์ง๋ ํค๋์ ์ฟ ํค๊ฐ ์๋ ์ํ์ธ๋ฐ, ์ด๋ป๊ฒ ์ฐ๊ฒฐ์ด ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฑธ๊น?
๋๋ฒ๊น ์์ ๋ณธ ์ด์ํ ํ์
์์ฒญ์ ๋ณด๋์ ๋์ ์์ฒญ ํค๋๋ฅผ ๋ณด๋ฉด ์ ๋ง๋ก ์ฟ ํค๊ฐ ๋ณด์ด์ง ์๋๋ค.

ํธ๋์ ฐ์ดํฌ๋ฅผ ์งํํ๋ ๋จ๊ณ์์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ๋ฅผ ์ฐ๊ณ ์ฟ ํค๊ฐ ์กด์ฌํ๋์ง ํ์ธํด ๋ดค๋ค.


์น์์ผ ์ ์ ์์ฒญ์ ๋ณด๋์ ๋ request๋ฅผ ๋ณด๋ฉด cookies = null ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ผ ์ง์ง null์ธ๊ฐ?
์๋๋ค. ์ฟ ํค๊ฐ null์ด๋ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค. ์กฐ๊ธ ๋ ์คํํด ๋ณด์.

request์์ getCookies()๋ฅผ ์คํํ ํ์ ๊ฐ์๊ธฐ null์ด์๋ ์ฟ ํค๊ฐ ์๊ฒผ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ํ ํ ํฐ์ด ๋ค์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ถ๋ช ์ฒ์์ null์ด์๋๋ฐ ์ด๋ป๊ฒ ๊ฐ์ด ์ถ๊ฐ๋ ๊ฑธ๊น? ๊ทธ๋์ getCookies()์ ๋ด๋ถ ๊ตฌํ์ ์ดํด๋ดค๋ค.
getCookies()๋ฅผ ํธ์ถํ์ ์ฟ ํค๊ฐ ์๊ธด ์ด์


public static boolean isPackageProtectionEnabled() SecurityManager๋ฅผ ๋ฐํํฉ๋๋ค๋ง, Security๊ฐ ํ์ฑํ๋์ด ์๊ณ package protection ๋ฉ์ปค๋์ฆ์ด ํ์ฑํ๋์ด ์์ ๋๋ง ๋ฐํํฉ๋๋ค.
๋ผ๊ณ ํ๋ค. package protection์ ํฐ์บฃ์ ๋ด๋ถ ๊ฐ๋ ์ผ๋ก, ์๋ธ๋ฆฟ ์ฝ๋๊ฐ ๊ฐ์ ํฐ์บฃ ๋ด๋ถ ํจํค์ง์ ์ ๊ทผํ๋ ๊ฒ์ ์ ํํ๊ธฐ ์ํ ๋ชฉ์ ์ ๊ฐ๋ ์ด๋ค. ํ์ง๋ง ํ๋์ ์๋ฒ์์๋ ๋๋ถ๋ถ ๋ฆฌํด๊ฐ์ด false๋ผ๊ณ ํ๋๋ฐ, Java 17 ์ดํ SecurityManager deprecated ๋์๋ค๊ณ ํ๋ค.
๋ด๋ถ๋ก ๋ ๋ค์ด๊ฐ ๋ณด์.

Tomcat์ getCookies() ๋ด๋ถ ๊ตฌํ์ ๋ฐ๋ผ๊ฐ ๋ณด๋ฉด cookiesConverted๋ผ๋ ํ๋๊ทธ๊ฐ ๋์จ๋ค.
์ด ๊ฐ์ ์์ฒญ์ ๋ค์ด์จ ์ฟ ํค๊ฐ Servlet API์ Cookie[] ๊ฐ์ฒด๋ก ๋ณํ๋์๋์ง๋ฅผ ๋ํ๋ธ๋ค. ๋๋ต์ ์ธ ํ๋ฆ์ ์๋์ ๊ฐ๋ค.
getCookies()
-> cookiesConverted ํ์ธ
-> false๋ผ๋ฉด convertCookies() ์คํ
-> ๋ด๋ถ ์ฟ ํค ํํ์ Servlet Cookie ๊ฐ์ฒด๋ก ๋ณํ
-> Cookie[] ๋ฐํ
ํฐ์บฃ์ ์์ฒญ์ด ๋ค์ด์ค๋ ์๊ฐ๋ถํฐ ๋ฌด์กฐ๊ฑด Cookie[]๋ฅผ ๋ง๋ค์ด๋์ง ์๋๋ค. ํ์ํ ์์ , ์ฆ getCookies()๊ฐ ํธ์ถ๋๋ ์์ ์ ๋ณํํ๋ค. ๊ทธ๋์ ๋๋ฒ๊น ์์ ์ฒ์์๋ cookies = null๋ก ๋ณด์๋ ๊ฒ์ด๋ค. ์์ง ๋ณํ์ด ์คํ๋์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
getCookies()๋ฅผ ํธ์ถํ๋ฉด ๊ทธ๋ ๋ด๋ถ์ ์ผ๋ก convertCookies()๊ฐ ์คํ๋๊ณ , ์์ฒญ์ ํฌํจ๋์ด ์๋ ์ฟ ํค๋ค์ด Cookie[] ํํ๋ก ๋ณํ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ฟ ํค๊ฐ ๊ฐ์๊ธฐ ์๊ธด ๊ฒ์ด ์๋๋ผ, ์๋ ์์ฒญ์๋ ์ฟ ํค๊ฐ ์์๊ณ , ํฐ์บฃ์ด ๊ทธ ์ฟ ํค๋ฅผ ๋์ค์ ๊ฐ์ฒด๋ก ๋ณํํ ๊ฒ์ด๋ค.


์ด์ null ์ด์๋ cookies์ ํ ํฐ์ด ๋ค์ด๊ฐ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํฐ์บฃ์ Cookie[] ๊ฐ์ฒด ๋ณํ์ lazy ํ๊ฒ ์ํํ๋ค.
ํฐ์บฃ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ชจ๋ ๊ฐ์ ์ฆ์ ๊ฐ์ฒด๋ก ๋ณํํ์ง ์๊ณ , ํ์ ์์ ๊น์ง ํ์ฑ์ ๋ฏธ๋ฃฌ๋ค.
์ ์์ฒญ์ด ๋ค์ด์จ ์ฆ์ ์ฟ ํค๋ฅผ ํ์ฑ ํ์ง ์์๊น?
์ฟ ํค๋ฅผ ์ฌ์ฉํ์ง ์๋ ์์ฒญ๋ ๋ง๋ค. ๊ทธ๋ฐ๋ฐ ๋ชจ๋ ์์ฒญ๋ง๋ค ๋ฌด์กฐ๊ฑด ์ฟ ํค ๋ฌธ์์ด์ ํ์ฑํ๊ณ Cookie ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๋ถํ์ํ ๋น์ฉ์ด ์๊ธด๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ํฐ์บฃ์ ๋ฆ๊ฒ ํ์ฑ ํ๋ ๊ฒ ๊ฐ๋ค.
์น์์ผ ํธ๋์ ฐ์ดํฌ์ ์ฟ ํค
๊ทธ๋ผ ๊ทผ๋ณธ์ ์ผ๋ก ์น์์ผ ์์ฒญ์ ์ฟ ํค๊ฐ ๋ถ๋ ๊ฒ์ด ๋ง์๊น? ์น์์ผ์ ์ฒ์๋ถํฐ ์น์์ผ ํ๋กํ ์ฝ๋ก ์์๋์ง ์๋๋ค. ์ฒ์์๋ ์ผ๋ฐ HTTP ์์ฒญ์ผ๋ก ์์ํ ๋ค, HTTP Upgrade ๊ณผ์ ์ ํตํด ์น์์ผ ์ฐ๊ฒฐ๋ก ์ ํ๋๋ค.
GET /ws HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
Sec-WebSocket-Version: 13
Cookie: accessToken=...
Origin: https://example.com
์๋ฒ๊ฐ ์ด ์์ฒญ์ ๋ฐ์ผ๋ฉด 101 Switching Protocols ์๋ต์ ๋ฐํํ๋ค. ๊ทธ ์ดํ๋ถํฐ ์น์์ผ ์ฐ๊ฒฐ์ด ์์๋๋ค.
์ฆ, ์น์์ผ ์ฐ๊ฒฐ์ ์์์ ์ HTTP ํธ๋์ ฐ์ดํฌ๋ค. ๊ทธ๋์ ์ด ๋จ๊ณ์์๋ ์ผ๋ฐ HTTP ์์ฒญ์ฒ๋ผ ํค๋, ์ฟ ํค, Origin ๋ฑ์ ๋ค๋ฃฐ ์ ์๋ค.
๋ธ๋ผ์ฐ์ ์ ํ์ค ์น์์ผ API๋ ๋ณด์์์ ์ด์ ๋ก Authorization ๊ฐ์ ์์์ HTTP ํค๋๋ฅผ ์ง์ ์ถ๊ฐํ ์ ์๋ค.
๊ทธ๋์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์น์์ผ ์ธ์ฆ์์๋ ๋ณดํต ๋ค์ ๋ฐฉ์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ค.
- ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ฆ
- Query Parameter ํ ํฐ ์ ๋ฌ
- STOMP CONNECT ํ๋ ์์ ํ ํฐ ์ ๋ฌ
์ด๋ฒ ํ๋ก์ ํธ์์๋ HTTP ํธ๋์ ฐ์ดํฌ ๋จ๊ณ์์ ์ฟ ํค๋ฅผ ํตํด ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ณ ์์๋ค.
๊ทธ๋ผ ์ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ์๋ ์ฟ ํค๊ฐ ์ ๋ณด์๋ ๊ฑธ๊น?
์ฒ์์๋ Chrome ๊ฐ๋ฐ์ ๋๊ตฌ์ ์น์์ผ ์์ฒญ ํค๋์ ์ฟ ํค๊ฐ ๋ณด์ด์ง ์์๊ธฐ ๋๋ฌธ์, ๋ธ๋ผ์ฐ์ ๊ฐ ์ฟ ํค๋ฅผ ๋ณด๋ด์ง ์์๋ค๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ์๋ฒ์์ `request.getHeader("Cookie")` ์ `request.getCookies()`๋ฅผ ํ์ธํด ๋ณด๋, ์ค์ ๋ก๋ ์ธ์ฆ ํ ํฐ ์ฟ ํค๊ฐ ์์ฒญ์ ํฌํจ๋์ด ์์๋ค. ์ฆ, ์ฟ ํค๊ฐ ์๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ๋ฐ์ ๋๊ตฌ ์์์ ํ์ธ๋์ง ์์๋ ๊ฒ์ด๋ค.
์ ํํ ์ Chrome ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์์ฒญ ์ฟ ํค๊ฐ ๋ณด์ด์ง ์์๋์ง๋ ํ์ธํ์ง ๋ชปํ์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ฐ ์ฟ ํค๋ฅผ ๋ณด๋ด์ง ์์ ๊ฒ์ด ์๋๋ผ, ๊ฐ๋ฐ์ ๋๊ตฌ์์ ๋ณด์ด์ง ์์๋ ๊ฒ์ ๊ฐ๊น์ ๋ค.
์ ๋ฆฌ
์์ฒญ ํค๋์ ์ฟ ํค๊ฐ ๋ณด์ด์ง ์์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฟ ํค๋ฅผ ๋ณด๋ด์ง ์์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ค์ ์์ฒญ์๋ ์ธ์ฆ ์ฟ ํค๊ฐ ํฌํจ๋์ด ์์๋ค. ์ด ๊ณผ์ ์ ๋๋ฒ๊น ํ๋ฉฐ ํฐ์บฃ์ด ์ฟ ํค๋ฅผ ์ฆ์ ํ์ฑํ์ง ์๊ณ , getCookies() ํธ์ถ ์์ ์ ์ง์ฐ ๋ณํํ๋ค๋ ๋ด๋ถ ๋์๊น์ง ํ์ธํ ์ ์์๋ค.
AI๋ก ์ด์ ๋ ๋ฌธ์ ์ ์์ธ์ ์ฐพ๋ ๊ฒ์ ๋ธ๊น์ผ๋ก ํ ์ ์์ง๋ง, ์ด๋ ๊ฒ ์ง์ ํ๋ฆ์ ์ถ์ ํ๋ฉฐ ๋ด๋ถ ๊ตฌํ์ ํ์ธํ ๊ณผ์ ์์ฒด๊ฐ ์๋ฏธ์๋ ํ์ต์ด์๋ค๊ณ ์๊ฐํ๋ค.
'๊ฐ๋ฐ > ๊ธฐ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฐ๋ฅ ํด๋ฆญ๋ง ๋ง์ผ๋ฉด ๋๋ ์ค ์์์ต๋๋ค (2) | 2026.02.15 |
|---|---|
| ์ง์ฐ๋ก๋ฉ์ ์กฐ์ฌํ ์ฌ์ฉํฉ์๋ค (0) | 2026.01.11 |
| RestAssured์ Jackson ๋ฒ์ ํธํ์ฑ(feat. Spring Boot 4.0.0) (0) | 2025.11.30 |
| Spring Boot ํ ์คํธ์์ ์ปค๋ฅ์ ๊ณ ๊ฐ์ด ๋ฐ์ํ๋ ์ด์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ (1) | 2025.11.17 |
| QueryDSL์ hibernate ๋ฒ์ ๋ถ์ผ์น๋ก ์ธํ ์์ธ ๋ฐ์ (0) | 2025.11.02 |
