- Session ID, Access Token, JWT(JSON Web Token)은 사용자(또는 시스템)에 대한 인증 및 권한부여를 위해 사용되는 대표적인 기술이다.
- 이 기술들은 실제 복합적으로 사용되지만 각기 목적과 저장위치, 생성 및 관리상의 특성이 있기 때문에 이를 잘 이해해야 적합한 기술을 유효적절하게 선택할수 있을 것이다.
구분 | 목적 | 생성방법 | 저장 위치 | 관리방법 |
---|---|---|---|---|
Session ID | 전통적인 Session기반의 인증에서 사용자의 인증 상태를 표현하는 기술이며, 클라이언트가 서버에 요청을 보낼때마다 해당 사용자의 상태를 식별할 수 있음 | 사용자가 로그인하면 서버는 데이터베이스 또는 메모리에 Session정보를 다양한 방법으로 생성하고 해당 Session의 고유 ID를 클라이언트에게 전달함 | 클라이언트의 브라우저에서 주로 Cookie 형태로 저장됨 | 서버는 Session ID를 통해서 사용자의 상태와 정보를 추적하고 관리함 |
Access Token | 주로 OAuth 또는 OAuth2.0과 같은 권한부여를 위한 프레임워크에서 사용되는 기술이며, 사용자가 특정 리소스에 접근할 권한을 부여 받은 것을 식별할 수 있음 | 사용자가 권한부여 과정을 거친 후, 권한 서버는 Access Token을 생성하여 클라이언트에게 전달함 | 다양한 방법으로 저장할 수 있지만, 웹 어플리케이션에서는 주로 Cookie 또는 Web Storage(localStorage, sessionStorage)에 저장됨 | Token은 주로 일정 시간동안 유효기간을 설정하는 것이 일반적이며, 유효기간이 만료되면 재로그인하여 서버에게 신규 Token을 발급받아야 함 |
JWT(JSON Web Token) | Microservice Architecture와 같이 분산환경에서 사용자 인증과 권한 부여, 기타 사용자 정보, Token 만료기간 등의 정보를 JOSN형태의 Token으로 클라언트와 서버간 송수신하기 위해 사용되는 기술임 | 서버는 사용자 인증 처리 이후에 JWT를 생성하여 서버 비밀키로 서명하고 클라이언트에게 전달함 | Cookie, Web Storage, HTTP header 등 다양한 방식으로 전달 및 저장됨 | 클라이언트가 서버에 요청할때 서버에게 받은 자신의 JWT를 보내면 서버는 이 JWT의 유효성과 무결성(구현에 따라 다름) 등을 검증하여 클라이언트의 요청을 처리함 |
1. 송수신암호화를 위한 SSL/TLS 적용
- Session ID에는 다양한 정보를 보관하게 되기 때문에 SSL/TLS로 통신구간 암호화를 적용하여 MITM을 방지하고 송수신 데이터의 안전성을 확보한다.
- 웹서버에 인증서를 설치하고 HTTPS를 활성화하여 구현할 수 있으며 모든 HTTP요청을 HTTPS로 리디렉션하도록 설정한다.
2. Cookie 접근제어를 위해 HttpOnly 설정
- JavaScript를 통한 Cookie접근을 제한하기 위하여 HttpOnly 플래그를 설정함으로써 XSS공격을 최소화 할 수 있다.
- HttpOnly 옵션을 포함하여 Cookie를 생성할 수 있으며 프레임워크에서 HttpOnly를 지원하는 경우에는 이 옵션 활성화를 통해 간간하게 구현할 수 있다.
document.cookie = "sessionid=1234567890; HttpOnly";
3. Cookie가 HTTPS를 통해서만 전송되도록 Secure Flag설정
- Cookie를 생성할 때 Secure 옵션을 추가하여 생성하면 Cookie를 HTTPS연결을 통해서만 전송함으로써 보안을 강화할 수 있다.
- 구현방법은 Cookie 생성시 Secure옵션을 추가하며, 프레임워크에서 Secure옵션을 지원하는 경우에는 이 옵션 활성화를 통해 간간하게 구현할 수 있다.
document.cookie = "sessionid=1234567890; Secure";
4. Session의 유효기간을 위해 Timeout 설정
- 생성된 Session이 탈취될 경우, 공격자는 이를 분석하여 Replay attack 또는 패턴추축 등으로 악용될수 있다.
- 서버의 데이터베이스 또는 메모리에 Session 정보를 저장할 때 만료시간을 함께 저장하고 각 요청마다 Session의 만료시간을 확인하도록 구현한다.
5. 중요 업무처리시 Session 재생성 구현
- Session의 유효기간 설정으로 보안을 강화할 수 있으나, 비밀번호 변경, 권한 변경과 같이 중요한 업무처리가 발생하는 경우에는 Session을 재생성하여 발행함으로써 전통적인 Fixed Session Attack을 방지한다.
- 대부분의 프레임워크들이 Session Regeneration 메커니즘을 지원하므로 이 가능을 활용한다.
1. Token의 유효기간 설정
- Toke의 유출이나 탈취 상황을 고려하여 Token의 유효기간을 설정한다.
- OAuth2.0 또는 JWT 등에서 Token을 발급할때 'expires_in“ 또는 “exp”와 같은 속성을 설정하여 Token의 유효기간을 설정한다.
- 또한 서버에서는 유효기간이 만료된 Token은 거부하도록 구현한다.
2. 접근가능한 Resource 제한
- Token의 유출되는 만약의 경우에도 해당 Token으로 접근할 수 있는 리소스를 제한함으로써 피해범위를 최소화 한다.
- OAuth2.0의 경우 Token요청시 “scope”파라메터를 통해 Token의 리소스 접근범위를 지정할 수 있다.
- 또한 서버에서는 Token의 scope를 검사하여 해당 Token으로 수행할 수 있는 작업을 제한하도록 구현한다.
3. Token 무효화 구현
- 의심스러운 활동이 감지될 경우 해당 Token을 강제적으로 무효화하는 기능을 구현한다.
- Token을 무효화하는 별도 API를 구현하여 무효화된 Token을 거부하도록 한다.
4. 안전한 Token Storage 사용
- 서버가 생성하여 클라이언트에게 전달된 Token은 안전한 저장소에 저장되도록 한다.
- Web Application의 경우, Local Storage는 XSS공격에 취약하므로 Session Storage 또는 HttpOnly 옵션을 적용하여 구현한다.
- Mobile Application의 경우, iOS의 Keychain, 안드로이드의 Keystore와 같은 안전한 저장영역을 이용하여 Token을 저장한다.
JWT개발시 보안 고려사항은 그 내용이 많으므로 별도로 작성하겠음