πŸ–₯️ λ°±μ—”λ“œ/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λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžμ˜ 둜그인 μƒνƒœλ₯Ό μœ μ§€ν•˜κ³ , μ‚¬μš©μžκ°€ μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•  λ•Œλ§ˆλ‹€ ν•΄λ‹Ή 정보λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžλ₯Ό μΈμ¦ν•©λ‹ˆλ‹€.