HTTP Servlet 을 통한 Cookie 사용하기

알파로그·2023년 3월 16일
0

Spring Boot

목록 보기
6/57

✏️ Rq 계층

📍 Rq

  • HTTP Servlet 관련 로직을 모아놓은 Class 이다.
  • Request 와 Response 를 사용해 쿠키와 세션처리를 해결한다.
@Component
@RequestScope // 빼먹지 않게 조심!
@RequiredArgsConstructor
public class Rq {

    private final HttpServletRequest req;
    private final HttpServletResponse resp;

모든 쿠키에 “yes” 라는 이름을 붙이고 값을 Username 으로 설정해놓았다.

  • 쿠키를 조회할 때 어떤 username 으로 로그인 했는지 확인하기 위한 장치

쿠키를 확인할 때 먼저 쿠키의 Name 으로 알맞는 쿠키가 맞는지 확인하고,

내가 찾는 쿠키가 맞다면 쿠키 value 의 username 을 통해 어떤 회원이 요청했는지 확인할 수 있다.


  • 쿠키 생성
    • 첫번째 param : 쿠키 이름
    • 두번째 Param : 쿠키 값
  • 쿠키 조회
    • 루프를 통해 쿠키를 하나하나 조회
    • 쿠키의 이름으로 내가 찾는 쿠키인지 확인
    • 맞다면 쿠키의 value 반환
    • 없다면 “” 반환
    • ⚠️ null 로 반환해 봤는데 널포인트 예외가 발생해서 텅 빈 String 으로 반환 했다.
    //-- 쿠키 생성 --//
    public void createCookie(String username) {

        resp.addCookie(new Cookie("yes", username));
    }

    //-- 쿠키 확인 --//
    public String findCookie() {
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                if (name.equals("yes")) {
                    return value;
                }
            }
        }
        return "";
    }

  • 쿠키 삭제
    • 같은 이름오로 쿠키를 생성하고 쿠키 유효기간을 0 으로 설정해 초기화 해준다.
    //-- 쿠키 삭제 --//
    public void deleteCookie() {
        Cookie cookie = new Cookie("yes", null);
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }

✏️ Controller 계층

  • Service 뿐 아니라 Rq 도 DI 를 해준다.
Controller
@RequiredArgsConstructor
public class MemberController {

    //-- business logic DI --//
    private final MemberService service;

    //-- cookie logic DI --//
    private final Rq rq;

  • 요청 정보 저장이 완료되면 Rq 의 쿠키 생성을 참조한다.
    • 매개변수에 username 을 넘겨줘 쿠키의 value 에 저장될 수 있게 한다.
    //-- 로그인 하기 --//
    // http://localhost:8080/member/login?username=홍길동&password=1234
    @GetMapping("/member/login")
    @ResponseBody
    public MemberDto showLogin(
            @RequestParam String username,
            @RequestParam int password,
    ) {
        MemberDto result = service.login(username, password);
        service.createCookie(username);
        return result;
    }

  • Rq 의 쿠키조회를 통해 별도의 id 조회 없이 사용자를 확인해 응답할 수 있다.
  • 아무런 Cookie 정보 없이 접근할경우 “F-1” 을 반환 한다.
    //-- 쿠키로 로그인 정보 확인하기 --//
    // http://localhost:8080/member/me
    @GetMapping("/member/me")
    @ResponseBody
    public MemberDto showMe(HttpServletRequest req) {
        String value = service.findCookie(req);

        if (value.equals("null"))
            return new MemberDto("F-1", "로그인후 이용해 주세요.");

        return new MemberDto("S-1", "당신의 username(은)는 " + value +" 입니다.");
    }

  • 사용을 마치면 쿠키를 삭제해 로그 아웃 한다.
    //-- 쿠키 삭제 하기 --//
    // http://localhost:8080/member/logout
    @GetMapping("/member/logout")
    @ResponseBody
    public MemberDto logout(HttpServletResponse resp) {
        service.deleteCookie(resp);
        return new MemberDto("S-1", "로그아웃 되었습니다.");
    }

✏️ 문제점

Cookie 의 value 값을 사용해 간단하게 클라이언트를 식별했지만

Cookie 는 보안에 매우 취약한 구조이다.

  • 고객이 쿠키 정보 수정 가능
  • 서버도 쿠키 정보 수정 가능
  • 보안에 취약

문제를 해결하기 위해서 실무에서는 Session 을 사용해 클라이언트를 식별하고 있다.

profile
잘못된 내용 PR 환영

0개의 댓글