Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[iOS14] ํ‚ค ์ฒด์ธ(key Chain) ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/๊ผผ๊ผผํ•œ ์žฌ์€์”จ(์‹ค์ „)

[iOS14] ํ‚ค ์ฒด์ธ(key Chain)

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 4. 23. 22:08

ํ‚ค ์ฒด์ธ์ด๋ž€ ์• ํ”Œ ๊ณ„์—ด์˜ ์šด์˜์ฒด์ œ์—์„œ ๋™์ž‘ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๊ณ„์ •์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์•”ํ˜ธํšŒ๋œ ์ €์žฅ์†Œ

์•„์ดํด๋ผ์šฐ๋“œ, macOS, watchOS, ์•ฑ ์•„์ด๋””, ์›น์— ์ €์žฅ๋œ ์•„์ด๋””, ์™€์ดํŒŒ์ด ํŒจ์Šค์›Œ๋“œ ๋“ฑ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ด์šฉ๋œ๋‹ค.

 

ํ‚ค ์ฒด์ธ์˜ ํŠน์„ฑ

1. ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ์€ ์ž๊ธฐ ์ž์‹ ์˜ ํ‚ค ์ฒด์ธ์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

2. iOS์—์„œ ํ‚ค ์ฒด์ธ์˜ ์œ„์น˜๋Š” *์ƒŒ๋“œ๋ฐ•์Šค ์™ธ๋ถ€์ด๋ฏ€๋กœ, ์•ฑ์„ ์‚ญ์ œํ•ด๋„ ํ‚ค ์ฒด์ธ์— ์ €์žฅ๋˜๋Š” ์ •๋ณด๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Œ

3. ์•ฑ์˜ ํ”„๋กœ๋น„์ €๋‹ ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ ์•ฑ ๊ฐ„์˜ ์‚ฌ์šฉ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ผํ•œ ์• ๋น™๋ผ๋„ ํ”„๋กœ๋น„์ €๋‹ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ด์„œ ๊ธฐ์กด ์ •๋ณด๋ฅผ ๋” ์ด์ƒ ์กฐํšŒํ•  ์ˆ˜ ์—†๋‹ค.

4. ํ‚ค ์ฒด์ธ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜์—ฌ, ์„œ๋กœ ๋‹ค๋ฅธ ์•ฑ์—์„œ๋„ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ  ๊ฐ€๋Šฅ

5. ๋น„๋ฒˆ ๋˜๋Š” ๊ฐœ์ธํ‚ค์ฒ˜๋Ÿผ ๋ณดํ˜ธ๊ฐ€ ํ•„์š”ํ•œ ํ•ญ๋ณต์€ ์•”ํ˜ธํ™”๋˜์–ด ํ‚ค ์ฒด์ธ์œผ๋กœ ๋ณดํ˜ธ๋˜๋ฉฐ, ์ธ์ฆ์„œ์ฒ˜๋Ÿผ ๋ณดํ˜ธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์€ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ์ฑ„๋กœ ์ €์žฅ๋œ๋‹ค.

6. ํ‚ค ์ฒด์ธ์€ ์ž ๊ธ€ ์ˆ˜ ์žˆ์–ด์„œ ์ผ๋‹จ ์ž ๊ธฐ๋ฉด ํ•ด์ œํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ iOS์—์„œ๋Š” ๊ธฐ๊ธฐ์˜ ์ž ๊ธˆ์ด ํ—ค์ œ๋˜๋Š” ์ˆœ๊ฐ„ ํ‚ค ์ฒด์ธ์˜ ์ž ๊ทธ๋„ ํ•จ๊ป˜ ํ—ค์ œ๋œ๋‹ค.

 

*์ƒŒ๋“œ๋ฐ•์Šค : ์™ธ๋ถ€์—์„œ ๋ฐ›์€ ํŒŒ์ผ์„ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋ณดํ˜ธ๋œ ์˜์—ญ์—์„œ ์‹คํ–‰์‹œ์ผœ ๋ด„์œผ๋กœ์จ ์ž˜๋ชป๋œ ํŒŒ์ผ ํ”„๋กœ๊ทธ๋žจ์ด ๋‚ด๋ถ€ ์‹œ์Šคํ…œ ์ „์ฒด์— ์•…์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒƒ์„ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ์ˆ . ์ด๋ฅผ ํ™•์žฅํ•˜์—ฌ iOS ์•ฑ ๊ฐ„์— ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ฒฉ๋ฆฌ๋œ ๊ฐ์ž์˜ ์ƒŒ๋“œ๋ฐ•์Šค ๊ณต๊ฐ„์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, iOS ์‹œ์Šคํ…œ ์ž์ฒด์—์„œ๋Š” ํŒŒ์ผ์„ ํ•จ๋ถ€๋กœ ์“ธ ์ˆ˜ ์—†์ง€๋งŒ ์ƒŒ๋“œ๋ฐ•์Šค ๋‚ด์—์„œ๋Š” ํŒŒ์ผ ์“ฐ๊ธฐ๊ฐ€ ํ—ˆ์šฉ๋œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ '๋งํ•  ๊ฑฐ๋ฉด ๋„ˆ๋งŒ ๋งํ•ด๋ผ' ์šฐ๋ฆฌ๊ฐ€ ์•ž์—์„œ ๋‹ค๋ฃฌ ํ”„๋กœํผํ‹ฐ ๋ฆฌ์ŠคํŠธ๋‚˜ ์ปค์Šคํ…€ ํŒŒ์ผ ๋“ฑ์€ ๋ชจ๋‘ ์ƒŒ๋“œ๋ฐ•์Šค ๋‚ด์— ์ €์žฅ๋œ๋‹ค.

 

ํ‚ค ์ฒด์ธ์˜ ๊ตฌ์กฐ

์‹ค์งˆ์ ์œผ๋กœ ํ‚ค ์ฒด์ธ์€ ๋‹จ์ˆœํ•œ ๋ฐ๋ฒ ์ž„. macOS์—์„œ ์‚ฌ์šฉ์ž๋‚˜ ์•ฑ์€ ์›ํ•˜๋Š” ๋งŒํผ ํ‚ค ์ฒด์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, iOS์—์„œ๋Š” ๋ชจ๋“  ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค ์ฒด์ธ ํ•˜๋‚˜๋งŒ ์ œ๊ณต๋œ๋‹ค. ์•„์ดํด๋ผ์šฐ๋“œ์˜ ๊ฒฝ์šฐ๋Š” ์กฐ๊ธˆ ํŠน๋ฒผ๋žณ์„œ, ์‚ฌ์šฉ์ž๊ฐ€ ๋””๋ฐ”์ด์Šค์—์„œ ์•„์ดํด๋ผ์šฐ๋“œ ๊ณ„์ •์— ๋กœ๊ทธ์ธํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ์•„์ดํด๋ผ์šฐ๋“œ์šฉ ํ‚ค์ฒด์ธ์„ ์ œ๊ณตํ•œ๋‹ค.

 

ํ‚ค์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ 

1. ํ‚ค ์ฒด์ธ ์•„์ดํ…œ : ํ‚ค ์ฒด์ธ์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋กœ, ํ‚ค ์ฒด์ธ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค ์ฒด์ธ ์•„์ดํ…œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

2. ์•„์ดํ…œ ํด๋ž˜์Šค : ์ €์žฅํ•  ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜. id/pw, ์ธ์ฆ์„œ, ์ธํ„ฐ๋„ท ๋น„๋ฒˆ ๋ฐ ์ผ๋ฐ˜ ๋น„๋ฒˆ ๋“ฑ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž„์˜๋กœ ์•„์ดํ…œ ํด๋ž˜์Šค ์ถ”๊ฐ€๋Š” ๋ถˆ๊ฐ€ํ•˜๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์•„์ดํ…œ ํด๋ž˜์Šค๋กœ๋Š” ์ธํ„ฐ๋„ท์šฉ ์•„์ด๋””/ํŒจ์Šค์›Œ๋“œ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” kSecClassInternetPassword, ์ธ์ฆ์„œ๋ฅผ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” kSecClassGenericPassword ๋“ฑ์ด ์žˆ๋‹ค.

3. ์–ดํŠธ๋ฆฌ๋ทฐํŠธ : ์•„์ดํ…œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์†์„ฑ, ์•„์ดํ…œ ํด๋ž˜์Šค์— ๋”ฐ๋ผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

 

ํ‚ค ์ฒด์ธ ์•„์ดํ…œ์„ ์ •์˜ํ•  ๋•Œ๋Š” ์ €์žฅํ•  ๋ฐ์ดํ„ฐ์— ๋งž๋Š” ์•„์ดํ…œ ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ ์•„์ดํ…œ ํด๋ž˜์Šค๋Š” ์ €์žฅ๊ฐ’ ํŠน์„ฑใ…‡ ใ…”๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฐ€๋ น ์‚ฌํŒŒ๋ฆฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ด์šฉํ•˜๋Š” ์›น์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์•„์ดํ…œ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ์ด์šฉํ•ด์„œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์คŒ

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

์ผ๋ถ€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋‹จ์ˆœ ์ €์žฅ์ด์ง€๋งŒ ์–ด๋–ค ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

kSecAttrAccessControl์€ ๊ฐ’์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ฃน์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ฅผ ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ํ‚ค ์ฒด์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„ค์ด๋ฒ„ ์•ฑ์—์„œ ๋กœ๊ทธ์ธํ•œ ๋‹ค์Œ์— ๋„ค์ด๋ฒ„ ๋ฎค์ง์•ฑ์„ ์—ด๋ฉด ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” ํ‚ค ์ฒด์ธ์„ ์ด์šฉํ•ด ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ ํ•œ ์‚ฌ์ดํŠธ ๋‚ด์—์„œ๋„ ์•„์ด๋””/ํŒจ์Šค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์ด ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์ผ ๊ฒฝ์šฐ ๊ฐ ๊ฒฝ๋กœ๋ณ„๋กœ ๋”ฐ๋กœ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” kSecAttrServer, kSecAttrProtocol, kSecAttrPort, kSecAttrPath, kSecAttrAccount์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„๋„๋ฉ”์ธ,HTTP/HTTPSํ”„๋กœํ† ์ฝœ, ์ ‘์† ํฌํŠธ, ๊ฒฝ๋กœ, ์‚ฌ์šฉ์ž ๊ณ„์ • ๋“ฑ์„ ์ €์žฅํ•œ ๋‹ค์Œ ์ด๋ฅผ ํ˜„์žฌ์˜ ์›น์‚ฌ์ดํŠธ ์ •๋ณด์™€ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด์™ธ ์ „์ฒด ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์• ํ”Œ ๊ฐœ์ž˜์ž ์‚ฌ์ดํŠธ์˜ API ๋ ˆํผ๋Ÿฐ์Šค ํ™•์ธํ•ด๋ณด๊ธฐ

 

kSecAttrService : ์•ฑ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค ์•„์ด๋””

kSecAttrAccount : ์ €์žฅํ•  ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ๊ณ„์ •

 

ํ‚ค ์ฒด์ธ ์ž‘์—…์— ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ

์ €์žฅ : SecItemAdd

์ฝ๊ธฐ : SecItemCopyMatching

์ˆ˜์ • : SecItemUpdate

์‚ญ์ œ : SecItemDelete

์ด๋“ค์€ ๋ชจ๋‘ C์Šคํƒ€์ผ๋กœ ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด์„œ ํ‚ค ์ฒด์ธ ์ฟผ๋ฆฌ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” CFDictionary ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ธ์ž๊ฐ’์œผ๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐ๋ฒ ๋กœ ์น˜์ž๋ฉด ํ…Œ์ด๋ธ”๋ช…๊ณผ ํ‚ค ๊ฐ’, ์ €์žฅํ•  ๋‚ด์šฉ ๋“ฑ์ด ๋ชจ๋‘ ์–ด์šฐ๋Ÿฌ์ง„ SQL๋ฌธ์— ํ•ด๋‹นํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ €์žฅํ•  ๋ฐ์ดํ„ฐ, ์•„์ดํ…œ ํด๋ž˜์Šค, ์„œ๋น„์Šค๋ช… ๋“ฑ์„ ํ‚ค ์ฒด์ธ ์ฟผ๋ฆฌ์— ์ •์˜ํ•œ ๋‹ค์Œ, ๋ชฉ์ ์— ๋งž๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์›ํ•˜๋Š” CRUD์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

ํ‚ค์ฒด์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ

import Security // ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฝ์ž…

// ํ‚ค์ฒด์ธ ์ฟผ๋ฆฌ ์ •์˜
let keyChainQuery : NSDictionary = [
	kSecClass : <์•„์ดํ…œ ํด๋ž˜์Šค>,
	kSecAttrService : <์„œ๋น„์Šค ์•„์ด๋””>,
	kSecAttrAccount : <์‚ฌ์šฉ์ž ๊ณ„์ •>,
    kSecValueData : <์ €์žฅํ•  ๊ฐ’>
]

SecItemDelete(keyChainQuery) // ๊ธฐ์กด์— ์ €์žฅ๋œ ๊ฐ’ ์‚ญ์ œ

secItemAdd(keyChainQuery,nil) // ์ƒˆ๋กœ์šด ๊ฐ’ ์ถ”๊ฐ€

ํ‚ค ์ฒด์ธ ์ฟผ๋ฆฌ์— ๋“ค์–ด๊ฐ€๋Š” ํ‚ค๋“ค์€ ๋ชจ๋‘ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋“ค์ด๋ฉฐ, ์•„์ดํ…œ ํด๋ž˜์Šค ์—ญ์‹œ ํ‚ค ์ฒด์ธ์˜ ์ผ๋ถ€๋กœ ์ •์˜๋œ๋‹ค. 

Security ํ”„๋ ˆ์ž„์›Œํฌ์— ์„œ ์ œ๊ณตํ•˜๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ํ‚ค๋Š” ๋ชจ๋‘ CFString ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, NSDictionary ๊ฐ์ฒด์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ํ‚ค๋“ค์„ NSString ๋˜๋Š” String ํƒ€์ž…์œผ๋กœ ์บ์ŠคํŒ… ํ•ด์•ผํ•จ.

 

kSecClass ๋Š” ์•„์ดํ…œ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ํ•ญ๋ชฉ์ด๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด '์–ด๋–ค ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ๊ฑฐ๋ƒ'ํ•˜๋Š” ๊ฑฐ๋‹ค.

์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ดํ…œ ํด๋ž˜์Šค ํƒ€์ž…

 1. kSecClassGenericPassword

 2. kSecClassInternetPassword

 3. kSecClassCertificate 

 4. kSecClassKey

 5. kSecClassIdentity

 

์ด์ค‘์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”๊ฑด  1,2,3๋ฒˆ์œผ๋กœ ๊ฐ๊ฐ ์ผ๋ฐ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ธํ„ฐ๋„ท ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ธ์ฆ์„œ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉ

 

kSecAttrService๋Š” ์ง€์ •ํ•  ๊ฐ’์— ๋Œ€ํ•œ ์„œ๋น„์Šค ์•„์ด๋””๋ฅผ ์ง€์ •ํ•˜๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

์•ฑ ๋ฒˆ๋“ค ์•„์ด๋””๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ผ๋ฐ˜์ 

 

kSecAttrAccount๋Š” ์ €์žฅํ•  ๊ฐ’์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์ง€์ •ํ•˜๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

์•ฑ ์ค‘์—์„œ๋Š” ๋ฉ€ํ‹ฐ ๊ณ„์ •์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋Š”๋ฐ, ์•ฑ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ณ„์ •์„ ๋“ฑ๋กํ•ด๋†“๊ณ  ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ „ํ™˜ํ•ด ๊ฐ€๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›.

A์™€B ๊ณ„์ •์ด ์žˆ์„ ๊ฒฝ์šฐ ์„œ๋น„์Šค ์•„์ด๋””๋Š” ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋˜ ์‚ฌ์šฉ์ž ๊ณ„์ •๋งŒ A,B๋กœ ๋‹ค๋ฅด๊ฒŒ ์ €์žฅํ•˜๋Š” ์‹.

 

kSecValueData๋Š” ์‹ค์ œ๋กœ ์ €์žฅํ•  ๊ฐ’. Data ํƒ€์ž…์˜ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Data ํƒ€์ž…์œผ๋กœ ์ธ์ฝ”๋”ฉ ํ•˜๋Š” ๊ณผ์ •์ด ํฌํ•จ๋œ๋‹ค.

let str = "์ €์žฅํ•  ๋น„๋ฒˆ"

let value = str.date(using: .utf8, allowLossyConversion : false)

 

ํ‚ค ์ฒด์ธ์€ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋ฎ์–ด์“ฐ๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ํ‚ค๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์—†์Œ

๋”ฐ๋ผ์„œ ํ•ญ์ƒ ๊ธฐ์กด์— ๊ฐ’์„ ์‚ญ์ œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งŒ ์„œ์ˆ ํ•˜๊ณ  ์žˆ์œผ๋‚˜, ์ด ํ•จ์ˆ˜๋Š” ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ OSSatus ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”์— ๋”ฐ๋ผ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐ”๊พธ์–ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

let status : OSSatus = SecItemAdd(keyCahinQuery, nil)

assert(status == noErr, "ํ† ํฐ ๊ฐ’ ์ €์žฅ์— ์‹คํŒจ")

NSLog("status=\(status)")

์•„์ดํ…œ ํด๋ž˜์Šค๋ณ„ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

 

์ €์žฅ๋œ ๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž

import Security // ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฝ์ž…

// ํ‚ค์ฒด์ธ ์ฟผ๋ฆฌ ์ •์˜
let keyChainQuery : NSDictionary = [
	kSecClass : <์•„์ดํ…œ ํด๋ž˜์Šค>,
	kSecAttrService : <์„œ๋น„์Šค ์•„์ด๋””>,
	kSecAttrAccount : <์‚ฌ์šฉ์ž ๊ณ„์ •>,
    kSecReturnData : kCFBooleanTrye,
    kSecMatchLimit : kSecMatchLimitOne
]

// ์ €์žฅ๋œ ๊ฐ’ ์ฝ๊ธฐ
var dataTypeRef : AnyObject?
secItemCopyMatching(keyChainQuery, &dataTypeRef)

// ์ฝ์–ด์˜จ ๊ฐ’ ๋ณ€ํ™˜
let retrievedData = dataTypeRef as! Data
let value = String(data: retrieveData, encoding: String.Encoding.utf8)

 

์ฝ์–ด์˜ฌ ๋•Œ๋„ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ํ‚ค ์ฒด์ธ ์ •์˜์ž„

LimitOne์€ ์ผ์น˜ํ•˜๋Š” ํ•˜๋‚˜๋งŒ ์ฝ์–ด์˜ค๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฒ•. ๋ฌผ๋ก  ๋ชจ์กฐ๋ฆฌ ๋‹ค ์ฝ์–ด์˜ค๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋„ ์กด์žฌํ•จ

 

์ €์žฅ๋œ ๊ฐ’ ์ฝ๊ธฐ์—์„œ secItemCopyMatching๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ, ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” inout ํƒ€์ž…์œผ๋กœ ์ •์˜

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ˆ˜์ •๋œ ์ธ์ž๊ฐ’์„ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž„.

(c์˜ call by reference์™€ ๊ฐœ๋… ๋น„์Šท)

 

์ฝ์–ด์˜จ ๊ฐ’์„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•˜๊ณ , ์ŠคํŠธ๋ง ํƒ€์ž…์œผ๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•˜๋ฉด ๋

 

 

ํ‚ค ์ฒด์ธ ๋ž˜ํ•‘ํ•˜๊ธฐ

 

ํ‚ค ์ฒด์ธ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฃฐ ์ฝ”๋“œ๊ฐ€ ์ข€ ๋งŽ๋‹ค ใ… ใ… 

๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ๋Š” ์ฃผ๋กœ ํ‚ค ์ฒด์ธ์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋ž˜ํ•‘ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

Comments