π₯οΈ λ°±μλ/SpringBoot
[보μ] μΏ ν€μ μΈμ κ·Έλ¦¬κ³ JWT
OR15A
2023. 11. 23. 12:00
μΈμ , μΏ ν€, 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λ₯Ό μ¬μ©νμ¬ μ¬μ©μμ λ‘κ·ΈμΈ μνλ₯Ό μ μ§νκ³ , μ¬μ©μκ° μλΉμ€λ₯Ό μ΄μ©ν λλ§λ€ ν΄λΉ μ 보λ₯Ό μ¬μ©νμ¬ μ¬μ©μλ₯Ό μΈμ¦ν©λλ€.