[태그:] HTTP

  • HTTPS TLS, HSTS

    HTTP의 한계

    기본적으로 HTTP 프로토콜은 평문(plain text)으로 데이터를 주고 받고,

    이는 로그인 정보, 세션 쿠키, API 응답 등 모든 통신 내용이 노출될 수 있는 위험을 내포한다.

    이런 HTTP의 한계를 이용한 대표적인 공격으로는

    중간자 공격(MITM, Man-in-the-Middle)이 있으며, 공격자는 이 공격을 통해 사용자의 네트워크

    트래픽을 가로채고 내용을 열람하거나 수정할 수 있다. (e.g. 카페 와이파이에서 비밀번호 유출)

    이를 해결하기 위해, 평문의 데이터를 전송, 즉 주고 받을 때

    전송 구간을 암호화(Encryption) 하는 것을 도입하고자 했다.

    이 암호화를 수행하는 기술을 TLS(Transport Layer Security) 라 한다.

     

    TLS?

    웹 통신을 암호화하기 위한 표준 프로토콜,

    이전에는 SSL(Secure Sockets Layer)이라 불렸지만, 여러 보안 결함이 발견되었다.

    여러 보안 결함들을 해결하고 추가적인 보안 기능을 제공하도록 개선된 것이 TLS(버전 업그레이드).

    TLS는 통신 과정에서 다음 세 가지를 보장한다.

    • 기밀성(Confidentiality): 제3자가 데이터를 읽을 수 없음.
    • 무결성(Integrity): 데이터가 중간에서 변조되지 않음.
    • 인증(Authentication): 서버 또는 클라이언트가 신뢰할 수 있는 대상임을 검증.

     

    TLS 핸드셰이크 과정

    TLS는 실제 데이터 전송 전에 암호화된 연결을 수립(handshake)한다.

     

    Client Hello

    브라우저(클라이언트)가 서버에 TLS를 사용하고 싶은 의사와 가능한 암호화 알고리즘을 제안한다.

     

    Server Hello

    서버가 암호화 알고리즘을 선택, 공개키가 담긴 SSL 인증서를 전달한다.

     

    인증서 검증

    브라우저는 이 인증서가 신뢰할 수 있는 기관(CA, Certificate Authority)에서 발급된 것인지 검증,

    인증서에 포함된 도메인, 만료일, 서명 정보 등을 검사한다.

     

    비밀키 교환

    브라우저와 서버는 공개키 암호화를 통해 세션 키를 교환,

    이후 데이터는 이 세션 키로 대칭 암호화되어 통신한다.

     

     

    HTTPS는 TLS 위의 HTTP

    HTTPS = HTTP + TLS

    HTTP의 내용(요청 메서드, 헤더, 바디 등)은 그대로, ‘전송하는 과정’만 암호화한다.

    HTTPS의 효과

    • 통신 중 비밀번호, 쿠키, API 응답이 노출되지 않음.
    • 세션 하이재킹(Session Hijacking), 쿠키 탈취 등의 위험이 크게 줄어든다.
    • HTTP/2, HTTP/3 등 최신 프로토콜은 모두 HTTPS를 기반으로 동작.

     

    HSTS(HTTP Strict Transport Security)

    HTTPS를 적용했다고 완전히 안전한 것은 아니다.

    최초 접속이 HTTP로 이루어지는 상황을 생각해보자.

    e.g.

    사용자가 http://example.com 을 입력하여 접속 시도,

    브라우저에서는 먼저 HTTP로 요청 → 서버가 301 리다이렉트 → HTTP로 이동하게 된다.

    이때, 이 첫 요청 사이에 공격자가 개입하면 여전히 중간자 공격 가능성이 존재하게 된다.

    HSTS로 해결할 수 있다

    HSTS는 서버가 브라우저에 다음 헤더를 내려주는 방식이다.

    Strict-Transport-Security: max-age=3153600; includeSubDomains; preload

    이후 브라우저는 해당 도메인에 대해,

    • 무조건 HTTPS로만 접속하도록 강제.
    • HTTP 요청 시도하지 않음(리다이렉트 이전에 차단)
    • preload 옵션을 등록 시 주요 브라우저의 HSTS Preload List에 도메인이 포함되어, 첫 방문 전에 HTTPS만 사용 가능.

    즉, 사용자가 HTTP로 접속하도록 허용하지 않는다.

  • [개발자 필독] HTTP 상태 코드, 그것이 알고 싶다! 🧐

    안녕하세요! 웹 개발의 세계를 여행하는 모든 분들을 위한 필수 안내서를 준비했습니다. 바로 HTTP 상태 코드에 대한 이야기인데요. 웹사이트를 만들거나 API를 다룰 때, 우리는 서버와 클라이언트가 서로 ‘대화’하는 것을 보게 됩니다. 이때 HTTP 상태 코드는 그 대화의 결과를 알려주는 중요한 신호와도 같습니다.

    “요청이 잘 처리되었어!”, “뭔가 문제가 생긴 것 같아!” 와 같은 메시지를 숫자로 표현한 것이죠. 이 숫자들을 잘 이해하고 있다면, 문제 해결 능력이 한 단계 업그레이드될 거예요!

    HTTP 상태 코드, 왜 알아야 할까요?

    클라이언트(주로 웹 브라우저)가 서버에 무언가를 요청했을 때, 서버는 요청에 대한 처리 결과를 세 자리 숫자로 된 상태 코드로 응답합니다. 이 코드를 통해 우리는 요청이 성공했는지, 실패했다면 그 원인이 무엇인지 짐작할 수 있습니다. 디버깅 시간을 단축하고, 사용자에게 더 나은 경험을 제공하는 데 큰 도움이 되죠.

    상태 코드의 종류: 5가지 약속 🤝

    HTTP 상태 코드는 크게 5가지 그룹으로 나뉩니다. 첫 번째 숫자를 보면 어떤 종류의 응답인지 바로 알 수 있답니다.

    1xx (정보 응답)

    • 1xx (조건부 응답): “요청은 잘 받았고, 계속 진행해!” 라는 의미입니다. 요청을 받아 처리 중이라는 신호지만, 요즘에는 자주 사용되지는 않아요.

    2xx (성공)

    • 2xx (성공): 가장 기분 좋은 소식이죠! “네 요청, 성공적으로 처리했어!” 라는 뜻입니다. 대표적으로 200 OK가 있습니다.

    3xx (리다이렉션)

    • 3xx (리다이렉션): “요청을 처리하려면 다른 곳으로 가야 해.” 라는 의미입니다. 예를 들어, 웹사이트 주소가 바뀌었을 때 새로운 주소로 안내하는 역할을 합니다.

    4xx (클라이언트 오류)

    • 4xx (클라이언트 오류): “네 요청에 문제가 있어!” 라는 신호입니다. 주로 클라이언트 측에서 잘못된 요청을 보냈을 때 발생합니다.

    5xx (서버 오류)

    • 5xx (서버 오류): “미안, 지금은 내가 처리할 수가 없어…” 라는 서버의 외침입니다. 요청은 올바르게 들어왔지만, 서버 내부에서 문제가 발생한 경우입니다.

    꼭 알아둬야 할 대표적인 상태 코드 Top 7 🏆

    수많은 상태 코드가 있지만, 실무에서 자주 마주치는 코드들은 정해져 있습니다. 이것들만 알아도 대부분의 상황에 대처할 수 있을 거예요!

    400 Bad Request

    • 의미: 잘못된 요청
    • 상황: 서버가 요청의 문법을 이해할 수 없을 때 발생합니다. API 요청 시 필요한 파라미터를 빠뜨리거나, 형식이 잘못된 데이터를 보냈을 때 자주 볼 수 있습니다.

    403 Forbidden

    • 의미: 접근 거부
    • 상황: 요청한 리소스에 접근할 권한이 없을 때 나타납니다. 예를 들어, 일반 사용자가 관리자 전용 페이지에 접근하려고 할 때 서버는 “넌 들어올 수 없어!”라며 이 코드를 보냅니다.

    404 Not Found

    • 의미: 찾을 수 없음
    • 상황: 아마 가장 유명한 에러 코드가 아닐까 싶네요. 서버가 요청받은 리소스를 찾을 수 없을 때 발생합니다. 주소를 잘못 입력했거나, 삭제된 페이지에 접근할 때 보게 됩니다.

    500 Internal Server Error

    • 의미: 내부 서버 에러
    • 상황: 서버 내부에서 예기치 못한 오류가 발생했을 때 나타나는, 가장 일반적인 서버 에러입니다. 개발자는 이 에러를 보면 서버 로그를 확인하여 원인을 찾아야 합니다.

    502 Bad Gateway

    • 의미: 불량 게이트웨이
    • 상황: 게이트웨이나 프록시 역할을 하는 서버가 상위 서버로부터 잘못된 응답을 받았을 때 발생합니다. 일시적인 네트워크 문제나 서버 과부하가 원인일 수 있습니다.

    503 Service Unavailable

    • 의미: 서비스를 일시적으로 이용할 수 없음
    • 상황: 서버가 일시적으로 요청을 처리할 수 없을 때 나타납니다. 서버 점검 중이거나, 갑작스러운 트래픽 증가로 과부하 상태일 때 이 코드를 반환합니다.

    504 Gateway Timeout

    • 의미: 게이트웨이 시간 초과
    • 상황: 게이트웨이나 프록시 서버가 상위 서버로부터 응답을 제시간에 받지 못했을 때 발생합니다. 서버의 응답이 너무 느린 경우에 볼 수 있습니다.

    마치며

    지금까지 웹 개발의 필수 상식, HTTP 상태 코드에 대해 알아보았습니다. 이 코드들은 단순한 숫자가 아니라, 서버와 클라이언트 간의 원활한 소통을 돕는 중요한 언어입니다. 오늘 배운 내용들을 잘 기억해두셨다가, 문제 상황이 발생했을 때 당황하지 않고 현명하게 대처하는 개발자로 성장하시길 바랍니다! 🚀