HttpSession을 통한 세션로그인 구현해보기

2025. 11. 3. 23:52·CS/백엔드

지금 해보고 싶은 프로젝트가 회원제로 운영되는데, 그러면 인증/인가를 개발해야한다.

 

저번에 홍대 맛집 아카이빙 프로젝트는 JWT토큰을 사용해 인증/인가를 개발했는데, 이번에는 세션을 통해 인증/인가를 개발해보려고 한다. 쿠키 방식은 대충 알 것 같기도하고해서


세션이란?

일반적인 쿠키로 로그인을 처리할 때 쿠키에 값을 그냥 저장하면 탈취도 쉽고 탈취됐을 때 그대로 정보가 누출되기 때문에 주의가 필요하다.

 

그래서 쿠키에 저장하긴하는데, 세션이라는 것을 활용하여 쿠키에 저장한다.

세션이란 key-value 형태의 데이터구조로, key 값에 특정한 ID를 저장하며, value에 실제 정보가 저장되는 형태를 가진다.


세션 로그인

1. 로그인이 완료되면 서버는 유저의 정보를 담은 세션을 생성한다. key 값에 특정 ID (보통 UUID를 사용한다.), value에 실제 유저의 정보를 저장하고, 서버는 이를 세션 저장소에 저장한다. 스프링을 사용한다면 톰캣서버에 세션이 저장된다.

2. 그리고 서버는 key 값인 UUID를 쿠키를 통해 사용자에게 전달한다. 이 UUID가 JWT토큰의 역할을 하게된다.

3. 클라이언트는 요청을 보낼 때 UUID를 전송한다.

이렇게보면 그냥 UUID를 사용하는 JWT토큰의 느낌이 나긴한다.

 

아직 구현 전이지만 미리 JWT토큰과 비교해보자면, 세션방식이 UUID를 통해 고윳값을 생성하니까 조금은 더 안전하다는 느낌이랄까.. 다만 세션이 형성되는대로 저장소에 저장하는데, 대형서비스에서는 성능문제가 발생할 수 있겠다 정도


개발하기

HttpSession 클래스를 사용해서 세션로그인을 진행할 생각이다.

 

    @GetMapping("/success")
    public ResponseEntity<NormalResponseDTO> success(HttpServletRequest request,
                                                    @AuthenticationPrincipal OAuth2User oAuth2User) {

        if (loginSuccessService.checkEmail(oAuth2User.getAttribute("email"))) {
            HttpSession session = request.getSession();

            String email = oAuth2User.getAttribute("email");
            assert email != null;

            session.setAttribute("email", email);
            session.setMaxInactiveInterval(3600);

            NormalResponseDTO response = NormalResponseDTO.builder()
                    .code(HttpStatus.OK.value())
                    .message("성공")
                    .build();

            return ResponseEntity.ok(response);
        } else {
            return ResponseEntity
                    .status(HttpStatus.FOUND)
                    .location(URI.create("/signup"))
                    .build();
        }
    }

구글로그인 후 로그인한 유저의 이메일을 DB와 대조해서 있는 회원이면 세션을 만들어 전해주고, 회원이 아닌 경우 회원가입창으로 이동하게하는 코드다

 

우선 이전 과정은 스프링 시큐리티의 OAuth 로그인을 통해 로그인된 유저의 이메일이 OAuth2user 객체에 담겨서 온 상황이다.

그래서 세션 저장소를 가져와 세션에 이메일을 저장하고, 3600초 (1시간) 동안 유효하도록 설정한다.

 

1. 로그인이 완료되면 서버는 유저의 정보를 담은 세션을 생성한다. key 값에 특정 ID (주 UUID를 사용하지만 HttpSession을 사용하면 자동 생성됨), value에 실제 유저의 정보를 저장하고, 서버는 이를 세션 저장소에 저장한다. 스프링을 사용한다면 톰캣서버에 세션이 저장된다.

-> 세션객체를 불러와서 이메일을 세션에 저장한다. 스프링에서 세션 객체를 제공해주기 때문에 톰캣서버의 세션저장소에 세션이 저장된다.

 

2. 그리고 서버는 key 값인 UUID를 쿠키를 통해 사용자에게 전달한다.

-> 이 역시 Session 객체가 알아서 담당하게된다. 추가로 이를 쿠키로 등록하여 클라이언트가 인증용으로 담아보낼 UUID를 쿠키에 저장하는 일도 한다.

 

3. 클라이언트는 요청을 보낼 때 UUID를 전송한다.

-> HttpSession 객체를 사용하면 세션 및 쿠키관리를 모두 스프링에서 담당한다.

 

4. 클라이언트의 요청이 도착했을 때, getSession() 메서드를 사용하면 된다. 이 메서드를 사용하면 요청으로 들어온 쿠키 (HTTP 프로토콜을 사용하면 모든 요청에 쿠키가 담겨서 요청된다.)에서 세션ID의 key값을 가져와서 이를 토대로 세션을 가져오게된다.

 

추가로 매개변수가 true일 경우 세션이 없을 때 새로운 세션을 형성하고, false일 경우에는 새 세션을 형성하지 않는다. 로그인에서는 매개변수를 true, 인가 과정에서는 false로 설정해야하며, 기본값은 true

 

참 감사한 선배개발자 분들이 많은 것 같다. 이런걸 다 관리해주시다니


package com.DDDevelopers.smsf.login;

import com.DDDevelopers.smsf.dto.response.NormalResponseDTO;
import com.DDDevelopers.smsf.member.MemberRepositoryInterface;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.net.URI;

@Controller
@RequestMapping("/login")
public class LoginController {
    private final LoginService loginService;
    private final LoginSuccessService loginSuccessService;
    private final MemberRepositoryInterface memberRepositoryInterface;

    LoginController(LoginService loginService,
                    LoginSuccessService loginSuccessService, MemberRepositoryInterface memberRepositoryInterface) {
        this.loginService = loginService;
        this.loginSuccessService = loginSuccessService;
        this.memberRepositoryInterface = memberRepositoryInterface;
    }

    @GetMapping()
    public ResponseEntity<NormalResponseDTO> login() {
        return loginService.login();
    }

    @GetMapping("/success")
    public ResponseEntity<NormalResponseDTO> success(HttpServletRequest request,
                                                    @AuthenticationPrincipal OAuth2User oAuth2User) {

        if (loginSuccessService.checkEmail(oAuth2User.getAttribute("email"))) {
            HttpSession session = request.getSession();

            String email = oAuth2User.getAttribute("email");
            assert email != null;

            session.setAttribute("email", email);
            session.setMaxInactiveInterval(3600);

            NormalResponseDTO response = NormalResponseDTO.builder()
                    .code(HttpStatus.OK.value())
                    .message("성공")
                    .build();

            return ResponseEntity.ok(response);
        } else {
            return ResponseEntity
                    .status(HttpStatus.FOUND)
                    .location(URI.create("/signup"))
                    .build();
        }
    }
}

그래서 대충 이정도로 로그인 로직을 처리했고.. 추가로 회원가입 기능만 간단하게 만들어놨다. 이제 인증/인가 기능은 거의 완성된 것 같고 내일부터 본격적으로 웹소켓에 들어가보려한다.

 

 

앞으로(내일) 해보려는 것은..

- 웹소켓 기능 알아보기

- 오늘 로그인/회원가입 기능 구현한거 테스트하고 MySQL 연결하고 추가로 예외처리 몇 개 해주기

- DAN25 전에 배경조사

'CS > 백엔드' 카테고리의 다른 글

[CS] OPEN AI API로 간단한 메시지 보내고 받아보기  (0) 2025.11.19
WebSocketConfig로 사전 세팅하기  (0) 2025.11.04
[백엔드] slf4j로 로그 남기기  (0) 2025.10.27
[2025백엔드] 스프링인액션 독서 #7 - 4장. 스프링 시큐리티 2  (2) 2025.08.05
[2025백엔드] 스프링인액션 독서 #6 - 4장. 스프링 시큐리티 1  (4) 2025.08.04
'CS/백엔드' 카테고리의 다른 글
  • [CS] OPEN AI API로 간단한 메시지 보내고 받아보기
  • WebSocketConfig로 사전 세팅하기
  • [백엔드] slf4j로 로그 남기기
  • [2025백엔드] 스프링인액션 독서 #7 - 4장. 스프링 시큐리티 2
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (211) N
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59) N
        • JVM (12)
        • 백엔드 (20) N
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

    • 컬러잇 개발블로그
  • 공지사항

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
HttpSession을 통한 세션로그인 구현해보기
상단으로

티스토리툴바