Java

Spring boot로 Cookie 로그인 시연해보기

정훈5 2026. 1. 27. 15:01

아래의 사이트에서 Spring 프로젝트를 설정할 수 있다.

Name : cookie

자바: 17

Dependencies : Lombok, Spring web

 

https://start.spring.io/

 

설정

먼저 원하는 폴더에 다운받은 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 키 값을 통해 보호한다.