개발자들이 웹사이트, 모바일 어플, 웹 API 등을 만들때 해커들의
공격을 막기위한 보안 필수사항
* 해커들의 여러가지 공격들
- SQL injection
- XSS
- CSRF
1. 다른 사이트에서 유저가 보내는 요청을 조작
- 이메일에 첨부된 링크를 이용해
2. 해커가 직접 데이터에 접근 할 수 없다.
- 다른 오리진이기 때문에 response에 직접 접근할 수 없음
3. CSRF 공격을 하기 위한 조건
- 쿠키를 사용한 로그인
: 유저가 로그인 했을 때, 쿠키로 어떤 유저인지 알 수 있어야 함
- 예측할 수 있는 요청 / parameter를 가지고 있어야 함
: request에 해커가 모를 수 있는 정보가 담겨 있으면 안됨
4. CSRF를 막는 방법
- CSRF 토큰 사용하기
: 서버측에서 CSRF 공격에 보호하기 위한 문자열을 유저의 브라우저와
웹 앱에만 제공
- Same-site cookie 사용하기
: 같은 도메인에서만 세션/쿠키를 사용할 수있다.
클라이언트에서 인증 정보를 보관하는 방법
1. 토큰 기반 인증을 사용하는 이유
- 세션기반 인증 = 서버(혹은DB)에 유저 정보를 담는 방식
- 서버에서는 유저가 민감하거나 제한된 정보를 요청 할 때마다
세션 값과 일치하는지 확인
- 이러한 부담을 클라리언트에게 넘겨 주기 위해 고안됨
2. 토큰을 클라이언트에 저장 가능?
- 토큰은 유저 정보를 암호화한 상태로 담을 수 있고, 암호화했기
때문에 클라이언트에 담아도 무리가 없다.
3. 대표적은 JWT
- Json Web Token의 약자
- Json 포맷으로 사용자에 대한 속성을 저장하는 웹 토큰
4. JWT의 구조
- Header
: 어떤 종류의 토큰인지, 어떤 알고리즘으로 암호화 했는지를 담는다.
{
"alg": "HS256",
"typ": "JWT"
}
- Payload
: 유저의 정보, 권한 여부, 기타 필요한 정보등을 담는다.
{
"sub": "someInformation",
"name": "phillip",
"iat": 151623391
}
- Signature
: Header, Payload를 base64인코딩한 값과 salt값의 조합으로
암호화된 값을 담는다.
HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret);
5. 토큰 기반 인증의 장점
- Stateless & Scalability(무상태성 & 확장성)
: 서버는 클라리언트에 대한 정보를 저장할 필요가 없다
토큰을 헤더에 추가함으로 인증절차 완료
- 안정성
: 암호화 한 토큰을 사용하여 암호화 키를 노출 할 필요가 없다
- 어디서나 생성 가능
: 토큰을 생성하는 서버가 꼭 토큰을 만들지 않아도 됨
- 권한 부여에 용이
: 토큰의 payload안에 어떤 정보에 접근 가능한지 정의
6. 토큰기반 인증 절차
- 클라이언트가 서버에 아이디/비밀번호를 담아 로그인 요청
- 아이디/비밀번호가 일치하는지 확인하고, 클라이언트에게 보낼
암호화된 토큰을 생성
- 토큰을 클라이언트에게 보내주면, 클라이언트는 토큰을 저장
- 클라이언트가 HTTP헤더에 토큰을 담아 보낸다
- 서버는 토큰을 해독하여 맞다고 판단되면 클라이언트의 요청을
처리한 후 응답을 보내준다