Posts 화면 리디렉션시 쿠키 송신이 안되는 현상
Post
Cancel

화면 리디렉션시 쿠키 송신이 안되는 현상

상황


  • login.html 화면에서 로그인에 성공하면 쿠키에 logined=true 값을 세팅하고 index.html로 리디렉션 시킨다 image

  • 하지만, index.html 화면을 요청할 때, 기존에 세팅되었던 cookie값이 없어진다. image

원인


  • Set-Cookie 헤더의 속성 중 Path값을 따로 설정하지 않으면 쿠키를 응답한 화면이 포함된 디렉토리와 그 하위 디렉토리로 요청하는 경우에만 쿠키를 송신한다.
  • 파일 디렉토리는 아래와 같기 때문에 Path를 따로 설정하지 않으면, login 화면이 포함된 /user 디렉토리와 그 하위에 있는 자원을 요청하는 경우에만 쿠키가 송신된다.
  • 결과적으로, index 화면은 login 화면보다 상위 디렉토리에 존재하기 때문에 index 화면에 리디렉션시 쿠키가 송신되지 않았던 것이다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    ├── ./index.html
    ├── ./js
    │   ├── ./js/bootstrap.min.js
    │   ├── ./js/jquery-2.2.0.min.js
    │   └── ./js/scripts.js
    ├── ./qna
    │   ├── ./qna/form.html
    │   └── ./qna/show.html
    └── ./user
      ├── ./user/form.html
      ├── ./user/list.html
      ├── ./user/login.html
      ├── ./user/login_failed.html
      └── ./user/profile.html
    

해결 방법


  • Path 속성을 추가해준다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public String login(String id, String pw, HttpResponse response) throws IOException {
      User findUser = findUser(id);
      if(findUser!=null && pw.equals(findUser.getPassword())) {
          response.setCookie("logined=true; Path=/");
          return "/index.html";
      }
    
      response.setCookie("logined=false; Path=/");
      return "/user/login_failed.html";
    }
    

image

  • 하지만, 이 글 에 보면 여러 개의 애플리케이션이 웹 서버에 있는 경우, Path를 루트 디렉토리(/)로 세팅하는 것은 보안상 좋지 않다고 말한다. 왜냐하면 하위 디렉토리(ex : …/newapp)에 다른 애플리케이션이 있다면, 해당 애플리케이션에 요청하는 경우에도 쿠키가 송신되기 때문이다.

  • 따라서, 여러 애플리케이션을 동일한 웹 서버에서 호스팅하는 시나리오에서는 가능한 개별 애플리케이션을 자체 하위 디렉토리(“…/myapp1”, “…/myapp2” 등)에 배치하고 개별 쿠키를 개별 애플리케이션 경로에만 유효하도록 선언하는 것이 좋다.


속성설명
name = VALUE쿠키에 부여된 이름과 값(필수)
Expires = DATE쿠키의 유효 기간(default : 브라우저 닫을 때까지)
Path = PATH쿠키 적용이 되는 서버 상의 디렉토리(default : 쿠키를 생성한 도큐먼트와 같은 디렉토리)
Domain = 도메인 명쿠키 적용 대상이 되는 도메인 명(default : 쿠키를 생성한 서버의 도메인)
SecureHTTPS로 통신하는 경우에만 쿠키 송신
HttpOnly쿠키를 자바스크립트에서 엑세스하지 못하도록 제한

참고 자료


This post is licensed under CC BY 4.0 by the author.

JPA 내부 구조 살펴보기

BufferedReader의 readLine() 메서드 이후의 코드로 진행이 안되는 현상