์ธ์ , ์ฟ ํค, JWT๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ธ์ฆ ๋ฐ ์ธ์ ๊ด๋ฆฌ์ ์ฌ์ฉ๋๋ ์ค์ํ ๊ธฐ์
์ฟ ํค (Cookies)
์ฟ ํค๋ ํด๋ผ์ด์ธํธ ์ธก(๋ธ๋ผ์ฐ์ )์ ์ ์ฅ๋๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ๋ค
์ฅ์ :
- ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์ถ์ ์ ์ ํฉํฉ๋๋ค.
- ์ธ์ ๊ด๋ฆฌ, ์ฌ์ฉ์ ์ธ์ฆ, ์ฌ์ฉ์ ์ ํธ๋ ๋ฑ์ ์ ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋จ์ :
- ์ฉ๋ ์ ํ(๋๋ต 4KB)์ด ์์ต๋๋ค.
- ๋งค HTTP ์์ฒญ๋ง๋ค ์ฟ ํค ๋ฐ์ดํฐ๊ฐ ์๋ฒ๋ก ์ ์ก๋๋ฏ๋ก, ๋คํธ์ํฌ ํธ๋ํฝ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
- XSS(Cross-Site Scripting)์ ๊ฐ์ ๋ณด์ ์ทจ์ฝ์ ์ ๋ ธ์ถ๋ ์ ์์ต๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ:
- ์ฟ ํค๋ Set-Cookie ํค๋๋ฅผ ํตํด ์์ฑ๋๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ์ดํ ์์ฒญ์ Cookie ํค๋๋ฅผ ์๋์ผ๋ก ํฌํจ์ํต๋๋ค.
- HttpOnly, Secure, SameSite ๋ฑ์ ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ณด์์ ๊ฐํํ ์ ์์ต๋๋ค.
// ์ฟ ํค ์์ฑ ๋ฐ ์ค์
Cookie cookie = new Cookie("session_id", "123456789");
cookie.setHttpOnly(true);
cookie.setMaxAge(7 * 24 * 60 * 60); // 1์ฃผ์ผ
response.addCookie(cookie);
// ์ฟ ํค ๊ฐ์ ธ์ค๊ธฐ
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("session_id".equals(c.getName())) {
// ์ธ์
ID ์ฒ๋ฆฌ
}
}
}
์ธ์ (Sessions)
์ธ์ ์ ์๋ฒ ์ธก์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ
์ฅ์ :
- ๋ณด์์ฑ์ด ๋์ต๋๋ค. ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์๋ฒ์ ์ ์ฅ๋๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ธก์์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ํฐ ๋ฐ์ดํฐ ์ ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋จ์ :
- ์๋ฒ์ ๋ถ๋ด์ ์ค ์ ์์ต๋๋ค. ๋ง์ ์ฌ์ฉ์๊ฐ ์ ์ํ ๊ฒฝ์ฐ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ํ๋ฅผ ์ ์งํ๋ ์๋ฒ ํ๊ฒฝ์ด ํ์ํฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ:
- ์ธ์ ID๋ ์ฟ ํค๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๋ฉฐ, ์ด๋ฅผ ํตํด ์๋ฒ๋ ๊ฐ ์์ฒญ์ ์ฌ์ฉ์์๊ฒ ๋งคํํฉ๋๋ค.
- ์๋ฒ๋ ์ธ์ ID์ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํฉ๋๋ค.
// ์ธ์
์ ์ฌ์ฉ์ ์ ๋ณด ์ ์ฅ
HttpSession session = request.getSession();
session.setAttribute("user", userObject);
// ์ธ์
์์ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
User user = (User) session.getAttribute("user");
JWT (JSON Web Tokens)
JWT๋ JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ ํฐ ํํ๋ก ์์ ํ๊ฒ ์ ์กํ๋ ๋ฐฉ๋ฒ
์ฅ์ :
- ํ์ฅ์ฑ: ๋ถ์ฐ ์์คํ ๋๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ์ ํฉํฉ๋๋ค.
- ์ธ์ ์ํ๋ฅผ ์๋ฒ์์ ์ ์งํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์๋ฒ์ ๋ถ๋ด์ด ๊ฐ์ํฉ๋๋ค.
- ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ์ ํตํฉ์ด ์ฉ์ดํฉ๋๋ค.
๋จ์ :
- ํ ํฐ์ด ํ์ทจ๋๋ฉด ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ๋ ธ์ถ๋ ์ ์์ต๋๋ค.
- ํ ํฐ ํฌ๊ธฐ๊ฐ ์ปค์ง ์ ์์ด ๋คํธ์ํฌ ์ค๋ฒํค๋๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
- ํ ํฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง๋ ๋ฌดํจํํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ:
- JWT๋ header, payload, signature ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์๋ฒ๋ ์ธ์ฆ ํ JWT๋ฅผ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ฐํํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ดํ ์์ฒญ์ JWT๋ฅผ ํฌํจ์์ผ ์๋ฒ์ ์ ์กํฉ๋๋ค.
- ์๋ฒ๋ JWT๋ฅผ ๊ฒ์ฆํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
// JWT ์์ฑ
String token = Jwts.builder()
.setSubject(user.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + 864000000))
.signWith(SignatureAlgorithm.HS512, "secretKey")
.compact();
// ์์ฒญ์์ JWT ๊ฒ์ฆ
String token = request.getHeader("Authorization");
if (token != null) {
// ํ ํฐ ๊ฒ์ฆ ๋ก์ง
}
๊ฒฐ๋ก
์ฟ ํค: ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ์ฅํ ๋ ์ ์ฉํ์ง๋ง, ๋ณด์ ๋ฐ ์ฉ๋ ์ ํ์ด ์์ต๋๋ค.
์ธ์ : ์๋ฒ ์ธก์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์์ผ๋, ์๋ฒ์ ๋ถ๋ด์ ์ค ์ ์์ต๋๋ค.
JWT: ๋ถ์ฐ ํ๊ฒฝ์ ์ ํฉํ๊ณ ์๋ฒ ๋ถ๋ด์ด ์ ์ง๋ง, ๋ณด์๊ณผ ํ ํฐ ๊ด๋ฆฌ์ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
์ฟ ํค, ์ธ์ , JWT์ ์ฌ์ฉ ์์
- ๋ก๊ทธ์ธ: ์ฌ์ฉ์ ์ธ์ฆ ํ ์ธ์ ID ๋๋ JWT๋ฅผ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค. ์ธ์ ID๋ ์ฟ ํค์ ์ ์ฅ๋๊ฑฐ๋ JWT๋ ๋ณดํต Authorization ํค๋์ ํฌํจ๋ฉ๋๋ค.
- ํ์๊ฐ์ : ํ์๊ฐ์ ์์๋ ๋ณดํต ์ฟ ํค๋ ์ธ์ , JWT๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์ธ์ฆ ๋ฉ์ผ์ ๋ณด๋ด๋ ๋ฑ์ ์์ ์ ์ํํฉ๋๋ค.
- ์ฌ์ฉ์ ์ํ ์ ์ง: ๋ก๊ทธ์ธ ํ ์ฟ ํค, ์ธ์ ๋๋ JWT๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํ๊ณ , ์ฌ์ฉ์๊ฐ ์๋น์ค๋ฅผ ์ด์ฉํ ๋๋ง๋ค ํด๋น ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํฉ๋๋ค.
'๐ฅ๏ธ ๋ฐฑ์๋ > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.5 ์คํ๋ง๋ฐ์ดํฐ JPA (0) | 2023.11.23 |
---|---|
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.4 JPA API (0) | 2023.11.23 |
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.3 ํ ์คํธ, ๋ก๊น , ๋น๋ (1) | 2023.11.23 |
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.2 ์์กด์ฑ๊ณผ ์๋์ค์ (0) | 2023.11.23 |
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.1 ์คํ๋ง๋ถํธ ๋ฑ์ฅ ๋ฐ ํต์คํํธ (0) | 2023.11.20 |