안드로이드 스튜디오 로그인 정보 가져오기 - andeuloideu seutyudio logeu-in jeongbo gajyeoogi

코드 한 줄

사용자 환경 : macOS Sierra 10.12.6Android Studio 3.0.1 {

  Build #AI-171.4443003, built on November 10, 2017

  JRE: 1.8.0_152-release-915-b08 x86_64

  JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

  }

현재 로그인 시스템이 구현되어 있는 대부분의 앱에는 자동 로그인 기능이 구현되어 있다.

자동 로그인 기능이 구현되어 있지 않은 앱을 사용해본 경험이 있다면 이 기능을 사용함으로써 앱이 많은 편리함을 가져다 준다는 것을 알 수 있다.

이 기능을 구현하기 위해 우리는 SharedPreference API를 사용할 것이다.

1. 가장 먼저 정보를 저장하기 위한 메소드를 내장한 클래스를 구현한다.

import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; public class SaveSharedPreference { static final String PREF_USER_NAME = "username"; static SharedPreferences getSharedPreferences(Context ctx) { return PreferenceManager.getDefaultSharedPreferences(ctx); } // 계정 정보 저장 public static void setUserName(Context ctx, String userName) { SharedPreferences.Editor editor = getSharedPreferences(ctx).edit(); editor.putString(PREF_USER_NAME, userName); editor.commit(); } // 저장된 정보 가져오기 public static String getUserName(Context ctx) { return getSharedPreferences(ctx).getString(PREF_USER_NAME, ""); } // 로그아웃 public static void clearUserName(Context ctx) { SharedPreferences.Editor editor = getSharedPreferences(ctx).edit(); editor.clear(); editor.commit(); } }

line 7. key 값에 해당된다.

line 9~11. 모든 액티비티에서 인스턴스를 얻기 위한 메소드이다.

line 14~18. 로그인 시 자동 로그인 여부에 따라 호출 될 메소드이다. userName이 저장된다.

line 21~23. 현재 저장된 정보를 가져오기 위한 메소드이다.

line 26~30. 자동 로그인 해제 및 로그아웃 시 호출 될 메소드이다.

2. 자동 로그인 여부를 체크할 인증용 액티비티 생성.

import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class FirstAuthActivity extends AppCompatActivity { private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first_auth); if(SaveSharedPreference.getUserName(FirstAuthActivity.this).length() == 0) { // call Login Activity intent = new Intent(FirstAuthActivity.this, LoginActivity.class); startActivity(intent); this.finish(); } else { // Call Next Activity intent = new Intent(FirstAuthActivity.this, HomeActivity.class); intent.putExtra("STD_NUM", SaveSharedPreference.getUserName(this).toString()); startActivity(intent); this.finish(); } } }

line 15~20. SharedPreference에 저장되어 있는 정보의 길이가 0일 경우, 즉 없을 경우 로그인 액티비트를 호출한다.

line 20~26. 나머지 경우, 즉 저장되어 있는 정보가 있을 경우 바로 로그인 다음 액티비티를 호출한다.

3. 자동 로그인 설정 시 사용할 코드

SaveSharedPreference.setUserName(LoginActivity.this, editId.getText().toString());

로그인 액티비티에서 자동 로그인 설정과 함께 로그인 시 EditText의 값을 SaveSharedPrefernce.setUserName(Context, String) 메소드를 통해 저장.

Tag Android, Java, Login, Mac, preference, shared, studio, svae, 로그인, 안드로이드, 저장, 정보

[Android / Java]

앱에 필요한 정보를 저장하는 SharedPreferences 

* 목표 : SharedPreferences의 개념, 사용방법, 주의사항에 대해 알아보자.

우리가 앱이나 웹에서 체크박스를 이용해 ID, Password를 저장하는 것을 많이 봤을 것이다.

바로 이런식으로 말이다. 흰 네모칸의 체크박스를 클릭하면 내가 입력한 계정 정보가 저장되는 식이다. 근데 어떠한 원리로 저장이 되는 걸까?

먼저 로그인 단 화면을 열 때 서버와 통신해서 세팅하는 방법이 있다. 그 편이 사실 안전하긴 하지만 일단 네트워크 연결 상태여야 하고 수많은 유저의 정보를 저장해두기엔 용량 문제도 있다. 그래서 우리는 이 로그인 정보를 저장하기 위해 SharedPreferences를 이용해 보기로 한다.

기본적으로 애플리케이션은 하나의 프로그램이다. 이 프로그램이 종료되면 저장하지 않은 정보들은 사라진다. 이 프로그램 안에 파일을 만들어 저장하는 방식이 바로 SharedPreferences이다.

기본적으로 SharedPreferences를 사용하면 다음 경로의 앱 내부저장소에 파일 형태가 생성된다.

data/data/[package_name]/shared_prefs/[SharedPreferences의 파일 이름]

자 바로 실습을 진행해보자.

/** * 현재 로그인 정보를 저장하기 */ public void setLoginInfo(){ SharedPreferences sfLogin = getSharedPreferences("SF_LOGIN", MODE_PRIVATE); SharedPreferences.Editor editor = sfLogin.edit(); editor.putBoolean("CHK_LOGIN", true); editor.putString("ID", id); editor.apply(); }

"SF_LOGIN"을 Key로 하는 SharedPreferences 클래스를 MODE_PRIVATE으로 호출한 후에 Editor를 열어 수정 모드로 들어간 뒤, "CHK_LOGIN"이라는 Key값의 boolean 타입 데이터를 true로 저장해줬다. "ID"를 키값으로 하는 String 타입의 데이터도 저장했고 마지막에 apply()를 통해 적용시켜준다. (commit()은 deprecated 된 듯)

/** * 저장되어있는 로그인 정보 가져오기 */ private void getLoginInfo(){ IdEt = findViewById(R.id.login_id); //Id EditText chkLogin = findViewById(R.id.chk_login_save); //로그인 CheckBox SharedPreferences sfLogin = getSharedPreferences("SF_LOGIN", MODE_PRIVATE); boolean isLoginChecked = sfLogin.getBoolean("CHK_LOGIN", false); //로그인 체크박스의 상태, default : false chkLogin.setChecked(isLoginChecked); //로그인 체크박스 세팅 IdEt.setText(sfLogin.getString("ID", "")); //Id EditText에 ID값 불러오기 }

SharedPreferences 클래스를 선언하고 getSharedPreferences("파일 이름", 모드) 메서드를 이용해 기존에 등록되어 있는 정보를 가져오도록 했다. String, boolean, long, float, int 등 지정한 타입의 데이터를 키값으로 가져온다. "CHK_LOGIN"이라는 Key값을 가지고 지정한 boolean 값을 가져오는 것이다. default를 기본적으로 세팅해야 한다. Null 처리를 하기 위해서로 보인다.

기본적으로 SharedPreferences 파일은 map형태의 xml형식으로 저장되어있다.

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="ID">userName</string> <boolean name="FIRST" value="true" /> <boolean name="CHK_LOGIN" value="true" /> </map>

체크박스의 상태를 저장하여 갖고 오고 체크되어있다면 ID 값을 String 타입으로 저장한다. 또 앱의 최초 실행인지 판단하기 위해 FIRST라는 boolean 값도 만들어 뒀다. 

이런 방법으로 체크한 로그인 정보를 저장하고 로드할 수 있다. 그러나 내부저장소에 저장되는 파일인 만큼 보안에 취약한 단점이 있으므로 절대 Password도 같이 저장하면 안 된다. base64 방식을 이용한다 하더라도 복호화할 수 있는 상태로 저장되면 누구나 해킹할 수 있다. 따라서 패스워드는 저장하지 않는 방법을 권고하고 혹여나 하더라도 jasypt 같은 암호화 라이브러리를 이용해 암호화되어있는 상태로 저장할 수 있도록 한다.

Toplist

최신 우편물

태그