아래의 사이트에서 Spring 프로젝트를 설정할 수 있다.
Name : cookie
자바: 17
Dependencies : Lombok, Spring web

먼저 원하는 폴더에 다운받은 zip 파일의 압축을 풀어놓는다.
Spring Tool Suite 4 에 들어온 후
마우스 우클릭 후 "Import" 버튼을 클릭한다.

Gradle을 입력 후
"Existing Gradle Project" 를 클릭한다.

압축파일 풀어놓은 파일을 찾아 "폴더 선택"을 클릭한다.

패키지 및 설정을 아래의 그림과 같이 설정한다.

build.gradle 파일안에 JSP 의존성을 추가한다.
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:3.0.0'
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:3.0.1'

cookie 폴더 "우 클릭" 한다.
Gradle 파일 클릭 한다.
"Refresg Gradle Project"를 클릭한다.

application.properties 의 이름을 아래와 같이 변경한다.
application.yml로 변경한다.

application.yml으로 변경 후 코드를 아래와 같이 작성하면 된다.

server:
port: 8080
spring:
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
아래의 코드를 실행하게 되면 쿠키의 동작을 확인할 수 있다.
LoginForm
package com.example.cookie.auth.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class LoginForm {
private String username;
private String password;
}
AuthController
package com.example.cookie.auth.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.cookie.auth.dto.LoginForm;
import com.example.cookie.auth.service.AuthService;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("/cookie")
public class AuthController {
private static final String COOKIE_NAME = "SESSION";
private final AuthService authService;
public AuthController(AuthService authService) {
this.authService = authService;
}
// 로그인 페이지
// http://localhost:8080/cookie/login
@GetMapping("/login")
public String loginPage() {
return "login";
}
// 로그인 처리
@PostMapping("/login")
// HttpServletResponse : 자바 서블렛(Servlet) 기술에서 서버-> 클라이언트 로 보내는 HTTP 기술
public String doLogin(Model model, HttpServletResponse response, @ModelAttribute LoginForm form) {
String token = authService.login(form.getUsername(), form.getPassword());
if(token == null) {
model.addAttribute("error", "ID 또는 PW가 올바르지 않습니다.");
return "login";
}
Cookie cookie = new Cookie(COOKIE_NAME, token);
cookie.setHttpOnly(true);
cookie.setPath("/");
cookie.setMaxAge(30 * 1); // 30초 * 1초 = 30초
response.addCookie(cookie);
return "redirect:/cookie/me";
} // end of doLogin()
// 내 정보 페이지(로그인 필요)
@GetMapping("/me")
public String me(@CookieValue(value = COOKIE_NAME, required = false) String token, Model model ) {
String username = authService.findUsernameByToken(token);
if(username == null) {
return "redirect:/cookie/login";
}
model.addAttribute("username", username);
return "me";
} // end of me()
// 로그아웃
@PostMapping("/logout")
public String logout(@CookieValue(value = COOKIE_NAME, required = false) String token, HttpServletResponse response) {
authService.logout(token);
Cookie expired = new Cookie(COOKIE_NAME, "");
expired.setHttpOnly(true);
expired.setPath("/");
expired.setMaxAge(0); // 즉시 종료
response.addCookie(expired);
return "redirect:/cookie/login";
};
}
AuthService
package com.example.cookie.auth.service;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.stereotype.Service;
@Service
public class AuthService {
// (데모) username -> password
private final Map<String, String> users = Map.of("test", "test123",
"admin", "admin123");
// 세션토큰 -> username (실무는 Redis/DB)
private final Map<String, String> sessions = new ConcurrentHashMap<String, String>();
public String login(String username, String password) {
String pw = users.get(username);
if (pw == null || !pw.equals(password)) {
return "redirect:/login";
}
String token = UUID.randomUUID().toString();
sessions.put(token, username);
return token;
} // end of login()
public String findUsernameByToken(String token) {
if (token == null || token.isBlank())
return null;
return sessions.get(token);
} // end of findUsernameByToken()
public void logout(String token) {
if (token != null)
sessions.remove(token);
} // end of login()
} // end of AuthService()
login.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Login</title></head>
<body>
<h2>로그인</h2>
<% String error = (String) request.getAttribute("error"); %>
<% if (error != null) { %>
<p style="color:red;"><%= error %></p>
<% } %>
<form method="post" action="/cookie/login">
<div>
아이디: <input name="username" />
</div>
<div>
비밀번호: <input type="password" name="password" />
</div>
<button type="submit">로그인</button>
</form>
</body>
</html>
me
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Me</title></head>
<body>
<h2>내 정보</h2>
<p>안녕하세요, ${username} 님</p>
<form method="post" action="/cookie/logout">
<button type="submit">로그아웃</button>
</form>
</body>
</html>
로그인 페이지
http://localhost:8080/cookie/login
로그인 ID : test, PW: test123 으로 하게 되면 쿠키를 확인할 수 있다.

아래는 데이터 저장 방법

Map<> 타입의 users 에는 ID PW가 들어있다.
MAP<> 타입의 ConcurrentHashMap<>에는 UUID 값, ID 값이 들어있다.
Cookie는 사용자가 지정한 session 이라는 이름과, UUID의 값을 넣는다,
실제 사용자의 id를 드러내지 않고 UUID 키 값을 통해 보호한다.
'Java' 카테고리의 다른 글
| 2024.10.01 OOP 회원과 주문 관리 설계 (2) | 2024.10.01 |
|---|---|
| 2024.10.01 Stream API - 부록 3 (0) | 2024.10.01 |
| 2024.09.13 Java 유용한 클래스 - 3 람다식(Lambda expression) (1) | 2024.09.13 |
| 2024.08.01 JSP 프로그래밍 기본 JSP 파일 업로드 (0) | 2024.08.01 |
| 커스텀 태그(JSTL) 라이브러리 사용 jakarta.servlet.jsp.jstl 다운로드 (0) | 2024.07.12 |