본문 바로가기
Java

[Java] HTTP 웹 서버 구현 / 로그인 구현

by bkuk 2023. 3. 17.

HTTP는 무상태 프로토콜이다.

HTTP는 요청을 보내고 응답을 받으면 클라이언트와 서버 간의 연결을 끊는다. 각 요청 사이에 상태를 공유할 수 없다.

웹 애플리케이션에서 대표적인 기능 중의 로그인 기능을 보면, 클라이언트가 로그인을 완료하면 매 요청마다 로그인을 다시 하지 않는다. HTTP는 클라이언트가 한 행위를 기억할 수 없는데 이는 어떻게 가능한 걸까?

 

쿠키로(Cookie)로 클라이언트의 행위를 기억하자.

로그인과 같이 클라이언트의 행위를 기억하기 위한 목적으로 지원하는 것이 쿠키이다. 서버에서는 로그인 요청을 받으면 로그인 성공/실패 여부에 따라 응답 헤더에 Set-Cookie로 결과 값을 저장할 수 있다.

클라이언트는 응답 헤더에 Set-Cookie가 존재할 경우 Set-Cookie의 값을 읽어 서버에 보내는 요청 헤더의 Cookie 헤더 값으로 다시 전송한다. 즉, 헤더를 통해 공유할 데이터를 매번 다시 전송하는 방식으로 데이터를 공유한다.

 

로그인에 성공했다면 아래와 같은 응답을 보낸다. Set-Cookie 헤더의 값으로 logined=true를 전달했다. 클라이언트에서는 다음부터의 요청 헤더를 뜯어보면 Cookie라는 이름의 헤더가 추가되었으며, 그 값이 logined=true라는 것을 확인할 수 있다.

private void response302LoginSuccessHeader(DataOutputStream dos) {
    try {
        dos.writeBytes("HTTP/1.1 302 Found \r\n");
        dos.writeBytes("Content-Type: text/html;charset=utf-8 \r\n");
        dos.writeBytes("Set-Cookie: logined=true \r\n");
        dos.writeBytes("Location: /index.html \r\n" );
        dos.writeBytes("\r\n");
    } catch (IOException e) {
        log.error(e.getMessage());
    }
}

 

 

 

댓글